使用笔记本电脑作为中介在服务器之间传输文件

使用笔记本电脑作为中介在服务器之间传输文件

我的情况是,我有大量数据需要从服务器 A 传输到服务器 C。但是:

  • 服务器 A 无法访问服务器 C 的网络
  • 我有权通过 SSH 连接到服务器 A 和服务器 C
  • 为了通过 SSH 连接到服务器 C,我必须首先通过跳转主机服务器 B
  • 数据非常大,我无法从服务器 A 下载到我的笔记本电脑磁盘,然后将其上传到服务器 C
  • 这是“一次性”转移
  • 服务器运行的是 Linux,笔记本电脑是 Mac

描述情况的简要图表:

服务器连接

有没有什么方法可以通过我的笔记本电脑将文件从服务器 A 传输到服务器 C?

答案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

我能够使用该问题的一个答案来解决这个问题。以下是我采取的步骤:

  1. 将 ServerA 的 SSH 公钥添加到 ServerC 上的 authorized_keys
  2. 从笔记本电脑,将 ServerA 上的远程端口转发到笔记本电脑上的本地端口

    [user@laptop]$ ssh -R 5001:localhost:5002 serverA -N
    
  3. 从笔记本电脑,将笔记本电脑上的本地端口转发到 ServerC 上的远程端口(通过跳转主机 ServerB)

    [user@laptop]$ ssh -J userb@serverB -i ~/.ssh/id_rsa.pub -L 5002:localhost:22 userb@serverC -N
    
  4. 从 ServerA,scp通过端口 5001 传输文件

    [usera@serverA]$ scp -P 5001 ./* userb@localhost:/data/location/on/serverC
    

虽然有点冗长,但似乎有效。

数据永远不会驻留在笔记本电脑上,而是本质上通过 SSH 隧道传输,如下所示:

ServerA:5001 -> laptop:5002 -> ServerC:22

相关内容