我有一组服务器都正确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而不是代理转发。
漫长的故事:
在我的情况下,涉及四个主机:
我公寓的路由器没有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 -L或ssh -D跳转,通过非标准端口连接。 我现在可以直接从任何地方执行ssh c.example.org ,只要我可以连接到a.example.org 。 当然,其他基于SSH的协议,如Rsync,SCP,SFTP等也会自动支持。