我想将文件从我的机器 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 环境中很常见)。
以下命令将文件从 直接复制remotePath
到server2
您的机器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
是主机和端口的占位符。