答案1
如果你的跳转服务器没有对你进行太多限制,你可以在笔记本上使用一个命令来完成:
ssh jumpserverB ssh serverC tar cf - dir1 dir2 | ssh serverA tar xvf -
瞧!
编辑:呃 - 方向错误。所以我们换个方式吧:
ssh serverA tar cf - dir1 dir2 | ssh jumpserverB ssh serverC tar xvf -
dir1 和 dir2 是两个包含您要传输的数据的目录。
我再次编辑了这个答案 - 尽管 FGreg 已经解决了他原来的问题 - 因为他使用 -J 的解决方案在某些机器上有效,但在其他机器上无效。这是因为他们的 ssh 可能不知道 -J 标志,就像我的情况一样。因此,以下是一些评论的答案:
- 我使用了 tar(磁带归档程序),因为它可以处理无限量的数据,并且 - 如果您使用标准输出作为“磁带”,则可以将其通过管道传输到任何位置,而无需将其存储在中间的任何地方。这样,只要您可以从一台机器 ssh 到另一台机器,就可以通过无限数量的跳数传输数据。
- 诸如“主机密钥验证失败”之类的问题可以通过 ssh 连接到第一台机器,然后输入“ssh nextmachine”等来解决。当然,如果您必须在中间更改用户或使用 -i 指定公钥,您也必须在管道 ssh 命令中执行此操作。
- 是的,当然,tar 可以为您压缩数据;在大多数情况下,这会加快该过程。为了简单起见,我省略了它。
- FGreg 在其自己的答案中给出的解决方案有些不同,因为它不使用管道。它使用 ssh 的端口转发,这是处理管道无法完成工作的情况的好方法。同样,您可以根据需要连续添加任意数量的端口转发。例如在 host1 上:
ssh host2 -L 3333:host3:22
。这会像往常一样将您带到 host2。再次在 host1 的另一个窗口中输入ssh localhost -p 3333 -L 4444:host4:22
; 这会将您带到 host3。ssh -p 4444 ...
您明白了。 - 有时您需要反向转发,就像 FGreg 连接到 serverA 时必须做的那样。除了上面的 -L 示例外,我们可以使用
ssh serverA -R 4444:localhost:4444 serverA
; 来实现这一点,这样我们就可以ssh -p 4444 localhost
到达 host4 或scp -P 4444 localhost
。 - 当然,我们可以完全通过隧道将其他内容传输到其他端口或从其他端口传输到其他端口,但这将成为 ssh 常规博客文章,所以我将在这里停下来。
答案2
感谢 Andrzej A. Filip 指出https://unix.stackexchange.com/questions/85292/scp-from-one-remote-server-to-another-remote-server
我能够使用该问题的一个答案来解决这个问题。以下是我采取的步骤:
- 将 ServerA 的 SSH 公钥添加到 ServerC 上的 authorized_keys
从笔记本电脑,将 ServerA 上的远程端口转发到笔记本电脑上的本地端口
[user@laptop]$ ssh -R 5001:localhost:5002 serverA -N
从笔记本电脑,将笔记本电脑上的本地端口转发到 ServerC 上的远程端口(通过跳转主机 ServerB)
[user@laptop]$ ssh -J userb@serverB -i ~/.ssh/id_rsa.pub -L 5002:localhost:22 userb@serverC -N
从 ServerA,
scp
通过端口 5001 传输文件[usera@serverA]$ scp -P 5001 ./* userb@localhost:/data/location/on/serverC
虽然有点冗长,但似乎有效。
数据永远不会驻留在笔记本电脑上,而是本质上通过 SSH 隧道传输,如下所示:
ServerA:5001 -> laptop:5002 -> ServerC:22