有没有一种方法,用一个命令就能从我的计算机 A 经过计算机 B 到计算机 C 建立 ssh 连接,以便我可以访问计算机 C 上的 shell?
一个问题(似乎排除了使用 -L 选项简单地转发 ssh 连接)是,我有计算机 B 上的帐户密码,并且计算机 B 上的帐户被授权连接到计算机 C 上的帐户,但是我没有计算机 C 上帐户的密码。
答案1
我知道您只是想登录到计算机 C,而不是真正地将任何东西从 A 隧道传输到 C。因此,这应该可以解决问题:
ssh -t computer-b "ssh computer-c"
您可能需要输入两次密码,第一次是计算机 B 的密码,第二次是计算机 C 的密码,但这可以通过使用 ssh 的密钥对身份验证来避免。
答案2
您可能想要使用 SSH 的 ProxyCommand:http://benno.id.au/blog/2006/06/08/ssh_proxy_command
答案3
如果你使用 ssh 密钥,则可以为机器 B 生成一个新密钥,并使用它来从 A 连接到 B。在机器 B 上,你可以添加
command="ssh C" ssh-....
在~/.ssh/authorized_keys
文件中。这意味着每当您使用该 ssh 密钥连接到 B 时,它都会执行该ssh C
命令。
我不知道这是否适用于 scp。
答案4
使用ProxyCommand
请参阅man ssh_config
。我建议使用ProxyCommand
。让我们来看看你原来的场景:
- 计算机 A(您的计算机)
- 计算机 B(代理主机名)
- 计算机 C(只能通过 SSH 从计算机 B 访问)
编辑~/.ssh/config
以下内容。
Host computerb
HostName <hostname or IP of Computer B>
Host computerc 192.168.35.*
ProxyCommand ssh computerb nc -w 180 %h %p
现在你就可以透明地访问计算机 C。例如
ssh computerc
该方法的优点
更安全
您只需要将您的私钥放在计算机 A(您的计算机)上。该nc
命令将充当代理,SSH 将通过该代理加密流量。这包括身份验证。将您的私钥分发到多个服务器是一个非常糟糕的主意(因为任何带有您的私钥的受感染服务器最终都会泄露您的私钥)。
匹配多个目的地
可以使用 匹配多台目标计算机Host
。单台计算机或特定网络内的任何计算机(例如192.168.35.0/24
在上面的示例中)通过计算机 B 进行代理。它也可用作别名。
ssh 192.168.35.27
在上面的例子中,它将通过计算机 B 代理来获取 IP 地址。
菊花链代理
使用此方法,您可以根据需要连接任意数量的自动代理。例如,您可以添加一个电脑D它只能从计算机 C 访问,并且它将透明地工作。
Host computerd
ProxyCommand ssh computerc nc -w 180 %h %p
ssh computerd
将自动通过上述ssh_config
示例中的计算机 C 和计算机 B 进行代理。