如何使用ssh复制文件与代理转发多跳?

我有一组服务器都正确configuration了SSH代理转发。 这是一个典型的堡垒服务器风格的configuration,其中唯一可以从外部连接到的机器是服务器A.从服务器A,您可以使用代理转发连接到服务器B,C,D等。这一切都是完美的。

有时我想从本地机器上复制一个文件到服务器B.为了做到这一点,我必须首先将文件scp到服务器A.然后ssh到服务器A并scp文件到服务器B.然后我从文件中删除文件服务器A.

有没有一种方法可以在我的本地机器上执行一个命令,通过服务器A直接从我的电脑复制文件到服务器B?

如果您的sshd被configuration为允许TCP转发,那么您可以通过Abuild立从您的计算机到B的隧道,然后使用它来复制事物。 创build隧道

ssh -f -L 2050:B:22 A -N 
  • -f背景的SSH命令,所以你让你的terminal回来使用。
  • -L 2050:B22将localhost端口2050绑定到主机B端口22
  • -N不执行远程命令。

然后从您的计算机复制到B

 scp -P 2050 filetocopy localhost:/destination/path 

编辑:如果你使用

 ssh -L 2050:B:22 A -N & 

然后你会被告知当它的背景时,ssh命令的PID。

把这样的东西放入.ssh / config:

 Host Bp Cp Dp ProxyCommand ssh -W %h:%p A.example.com Host Bp Hostname B.example.com Host Cp Hostname C.example.com Host Dp Hostname D.example.com 

只是ssh或scp到/从Bp 。 您可以省略-p后缀,并直接在B.example.com上configurationProxyCommand,如果您始终是“外部”的话。

这会导致您的机器和堡垒主机之间的stream量开销很小,但无需代理转发即可运行。

您可以使用tar来复制文件:

 tar cC SRC-DIR SRC-FILE | ssh A.example.com ssh B.example.com tar xC DST-DIR 

如果需要,请务必将正确数量的报价添加到DST-DIR; 它会被三个炮弹解释。

使用ssh和tar非常灵活,例如当scp拒绝在两个远程位置上工作时。

我最近有一个类似(甚至更复杂)的案例,并设法解决这个问题。

简短的回答:使用ProxyCommand而不是代理转发。

漫长的故事:

在我的情况下,涉及四个主机:

  • 在我的办公室的Linux桌面
  • 互联网上的Linux VPN服务器
  • Linux家庭服务器在我的公寓
  • Linux笔记本电脑在我的公寓

我公寓的路由器没有ISP的公网地址,所以家里的笔记本电脑和家庭服务器都是双NAT的,我不能做端口转发或者是因为我无法控制ISP设备。 出于某种原因,家庭服务器始终连接到具有公共地址的VPN服务器。 这样我可以ssh -A进入VPN服务器, ssh -A进入家庭服务器,最后ssh进入我的家用笔记本电脑。

但有时我需要传输文件。 我不想一次一次地跳过rsync / scp多次。

ProxyCommand来救援。 把这些放在~/.ssh/ssh_config

 #主机A是一个公网地址的VPN网关。
主持a.example.org
  主机名称1.2.3.4

 #主机B是一个没有公共地址的家庭服务器/网关。
 #它通过VPN连接到主机A.
主机b.example.org
  主机名称10.255.255.100
   ProxyCommand ssh -W%h:%p a.example.org

 #主机C是我家的笔记本电脑。
主持人c.example.org
  主机名192.168.2.100
   ProxyCommand ssh -W%h:%p b.example.org

 #vim:ft = sshconfig:

这可以无限期地链接。 只要您的主机有快速连接,您可以保持链接主机D,主机E等。 不需要手动执行ssh -Lssh -D跳转,通过非标准端口连接。 我现在可以直接从任何地方执行ssh c.example.org ,只要我可以连接到a.example.org 。 当然,其他基于SSH的协议,如Rsync,SCP,SFTP等也会自动支持。