通过 ssh 隧道同步目录

ehu*_*top 4 networking ssh rsync

我有 3 台计算机/服务器,我们称它们为计算机 A、计算机 B 和计算机 C。

  • 计算机 A 可以通过ssh计算机 B访问。
  • 只有计算机 B 可以通过ssh计算机 C访问。
  • 计算机 A 无法直接访问计算机 C。

所以,我想rsync从计算机 A 到计算机 C 的目录,使用计算机 B(因为只有计算机 B 可以通过ssh计算机 C访问)。我想以rsync一种简单的方式使用,如下所示:

rsync -options /path_to_local IpComputerC:/path_to_remote
Run Code Online (Sandbox Code Playgroud)

我正在考虑一个ssh隧道,但我不知道我是否必须进行本地端口转发或远程端口转发,或者是否必须创建两个隧道:一个从 A 到 B,另一个从 B 到 C?

有什么建议??我真的很感激。

**更新:我做到了!!我创建了一个带有本地端口转发的 ssh 隧道,这意味着我使用机器 A 的本地端口通过机器 B 连接到机器 C 上的远程端口。命令的语法是:

ssh -f -N -L local_port_machineA:ip_machineC:remoteport_machineC user_machineB@ip_machineB
Run Code Online (Sandbox Code Playgroud)

在我的情况下,remoteport_machineC 应该是端口 22,因为我想通过 ssh rsync 目录。

之后,我们就可以在机器A上执行rsync命令了,这样:

rsync -avz -e "ssh -p local_port" /source_directory username_machineC@localhost:/target_directory
Run Code Online (Sandbox Code Playgroud)

就这样。此外,您可以在引号内的部分添加更多选项,例如键或文件等。**

cri*_*ret 8

比其他建议简单得多:使用rsync's-e | --rsh选项:

rsync -azv -e 'ssh -o "ProxyCommand ssh -A proxy -W %h:%p"' foo/ dest:./foo/
Run Code Online (Sandbox Code Playgroud)

请注意,我使用-A(代理转发),但它也应该具有密码验证的工作,如果你不使用钥匙,当然,你可以替换proxy使用B,并destC在你的榜样。

如果碰巧您没有足够新的ssh版本(>= 5.3,IIRC),您可以使用netcat代替-W选项ssh

rsync -azv -e 'ssh -o "ProxyCommand ssh -A proxy nc %h %p"' foo/ dest:./foo/
Run Code Online (Sandbox Code Playgroud)