如何通过中间机器scp?

Lem*_*bik 14 linux ssh scp

为了从家里 ssh 进入我的工作计算机,我们称之为C我必须执行以下操作:

ssh -t user@B ssh C
Run Code Online (Sandbox Code Playgroud)

B 是我可以从家里连接到的服务器,但 C 只能从 B 连接到。这很好用。

如果我想使用 将 C 上的文件复制到我的家用计算机上scp,我需要从我的家用计算机上执行什么命令?

use*_*709 17

我建议在您的以下内容.ssh/config

Host C
    User user
    ProxyCommand ssh -W %h:%p user@B
Run Code Online (Sandbox Code Playgroud)

如果主机 B 不受信任,并且适用于 scp 和 sftp,我就不安全了。


Dop*_*oti 10

this answer中所述,您可以使用该ProxyCommand指令让ssh主机透明地将您退回到第三台主机:

假设您有以下三个主机:

  • workstation.example.com - 这是你正在物理上工作的机器
  • proxy.example.com - 这是您路由 SSH 流量的机器
  • endpoint.example.com - 这是您希望流量最终结束的地方

~/.ssh/configon 中workstation,添加以下内容:

Host endpoint
    User endpointUser # set this to the username on the endpoint host
    HostName endpoint.example.com
    ProxyCommand ssh proxyusername@proxy.example.com nc %h %p 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

proxy主机上,确保nc安装了 (netcat)。

然后,在 上workstation,您可以ssh endpointsftp endpoint并且您将通过您的代理主机透明地代理到机器。 scp也会起作用。


小智 7

即使您需要使用证书进行身份验证(在 AWS 环境中很常见),这也是可能的且相对容易。

下面的命令会将文件从 server2 上的 remotePath 直接复制到您的机器 localPath 中。在内部,scp 请求通过 server1 进行代理。

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
Run Code Online (Sandbox Code Playgroud)

如果您改用密码身份验证,请尝试使用

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
Run Code Online (Sandbox Code Playgroud)

如果您在两台服务器中使用相同的用户凭据:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>
Run Code Online (Sandbox Code Playgroud)