在单个命令中通过中间计算机建立ssh连接隧道


10

是否可以通过一个命令在我的计算机A上通过计算机B与计算机C建立SSH连接,从而可以访问计算机C上的外壳?

一件容易事(似乎可以排除使用-L选项简单地转发ssh连接)的原因是,我拥有计算机B上的帐户的密码,并且计算机B上的帐户有权连接到计算机C上的帐户,但是我没有计算机C上该帐户的密码。


Answers:


8

我知道您只想登录到计算机C,而不是从A到C真正建立隧道。因此,这应该可以解决问题:

ssh -t computer-b "ssh computer-c"

您可能必须两次输入密码,首先是计算机B,然后是计算机C,但这可以通过使用ssh的密钥对身份验证来避免。


1
谢谢-有效!如果我可能这么胆大,请问一下随访情况。有什么想法可以在一个命令中将文件从A转换为C?
理智

有点棘手。可以通过将tar添加到混合中来完成,但是如果它只是一个文件,并且计算机B拥有磁盘空间来保留它一段时间,则分两步进行复制要容易得多。
自动对焦。

您也可以这样做三遍!ssh -t computer-b "ssh -t computer-c 'ssh computer-d'":d

0

您可能要使用SSH的ProxyCommand:http ://benno.id.au/blog/2006/06/08/ssh_proxy_command


我找不到使此工作有效的方法,因为我没有计算机C的密码,而且这种方法似乎是必需的。可以接受建议,因为这种方法确实更优雅。
理智

0

如果您使用的是ssh键,则可以为计算机B生成一个新密钥,并使用它从A连接到B。在计算机B上,您可以添加

command="ssh C" ssh-....

~/.ssh/authorized_keys文件中。这意味着每当您使用该ssh键连接到B时,它将执行ssh C命令。

我不知道这是否适用于SCP。


0

采用 ProxyCommand

请参阅man ssh_config。我建议利用的ProxyCommand。让我们来看看您的原始场景:

  • 计算机A(您的计算机)
  • 计算机B(代理主机名)
  • 计算机C(仅可从计算机B通过SSH访问)

~/.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地址。

菊花链代理

使用此方法,您可以根据需要菊花链连接许多自动代理。例如,您可以添加只能从计算机C访问的计算机D,并且该计算机将透明地工作。

Host computerd
    ProxyCommand ssh computerc nc -w 180 %h %p

ssh computerd在以上ssh_config示例中,将自动通过计算机C和计算机B进行代理。


我使用的是ProxyJump而不是ProxyCommand,它工作正常。看来现在有更多选择。
fgiraldeau
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.