如何在机器之间进行多跳 SCP 传输?

如何在机器之间进行多跳 SCP 传输?

我想将文件从我的机器 A 复制到服务器 C,但只能通过服务器 B 访问服务器 C。

不用先传输到服务器 B,登录然后传输到服务器 C,是否可以直接使用 SCP 或类似程序传输文件?

(Emacs tramp-mode 具有此功能,可以远程编辑文件)。

答案1

您可以添加-o选项来scp代替.ssh/config

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host在这种情况下是您的“服务器 B”。

答案2

假设使用 OpenSSH,在 .ssh/config 中添加到 SSH 配置中

Host distant
ProxyCommand ssh near nc distant 22

这将使 SSH 能够通过名为 near 的机器代理“直接”连接到名为 distance 的机器。然后它可以使用 scp 和 sftp 等应用程序连接到远程机器。

为了实现此功能,您需要在名为 near 的机器上安装“nc”(又名 netcat)。但许多现代系统已经安装了它。

假设您已经记住了 tar 的语法和操作规则,towo 的 tar 解决方案对于一次性问题更有效。

答案3

使用 (B) 机器附近的服务器上较新版本的 ssh,无需 netcat 即可完成以下操作:

Host distant
    ProxyCommand ssh near -W distant:22

但是,它要求近端(B)机器上的 AllowTcpForwarding 为是(默认)

编辑:需要 B 上的 OpenSSH 5.4+

答案4

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

以下命令将文件从 直接复制remotePathserver2您的机器localPath。 内部 scp 请求通过 代理server1

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

反过来也行得通(上传文件):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

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

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

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

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

-W选项内置于 OpenSSH 的新版本中,因此它仅适用于具有最低版本的机器(5.4,除非您的发行版反向移植了任何功能;例如,RHEL6 OpenSSH 5.3p1 包含此功能)。根据发行说明:http://www.openssh.com/txt/release-5.4

为 ssh(1) 添加了“netcat 模式”:“ssh -W host:port ...”。这将客户端上的 stdio 连接到服务器上的单个端口转发。例如,这允许使用 ssh 作为 ProxyCommand 通过中间服务器路由连接。

%h%p是主机和端口的占位符。

相关内容