使用中间 SSH 主机直接进行 rsync

使用中间 SSH 主机直接进行 rsync

这里有很多关于使用 rsync 与“代理”主机的很好的提示,但我发现的所有提示都假设到处都有 SSH 服务器。

我拥有的是:

  • 主机 A - rsync 客户端、SSH 客户端 (Linux)、访问 B
  • 主机 B - SSH 服务器 (Linux),访问 C
  • 主机 C - rsync 服务器(它实际上是一台带有 Deltacopy 服务器的 Windows 机器)

rsync 命令应该如何理解才能打开与主机 B 的 SSH 连接以及与主机 C 的远程隧道,然后从主机 C 中获取文件?

(希望我能清楚地解释我需要什么)

答案1

我假设 C 上的 rsync(Deltacopy)服务器监听 TCP 端口 873,并且您可以从 B 访问它。如果是这样,这将成为从 A 访问 C 的 TCP 端口的一般问题,当 A 无法直接访问 C,但可以ssh访问可以访问 C 的 B。

使用本地端口转发:

# on A
ssh -NL 8873:C_seen_from_B:873 userB@B_seen_from_A

8873是本地端口号,任意;ssh将监听此端口。我没有使用,873原因有二:

  1. 本地可能有一个 rsync 服务器已经占用了端口;
  2. 你很可能无论如何都不允许使用低于 1024 的端口

现在如果您从 A 连接到,localhost:8873那么您将到达 C 的端口 873。C 将看到来自 B 的流量。到目前为止,rsync 还没有任何特定内容。

接下来rsync在 A 上调用,并且在命令中需要指定LOCATIONC 上的任何地方,使用语法rsync://[USER@]HOST[:PORT]/LOCATION(请参阅“通过 rsync 守护程序访问”man 1 rsync),其中HOSTlocalhostPORT8873

例如,如果在 B 上你会使用rsync://C_seen_from_B:873/foo/bar,那么现在在 A 上你应该使用rsync://localhost:8873/foo/bar

这样,rsyncA 上的服务器将连接到localhost:8873A 上的ssh监听服务器。连接将通过 SSH 隧道传输,B 上的 SSH 服务器将为C_seen_from_B:873您连接。最终,rsyncA 上的调用将与 C 上运行的 rsync(Deltacopy)服务器进行通信。

相关内容