使用 rsync 或 scp 在多个级别或 SSH 跃点上复制文件

Copy file with rsync or scp over multiple level or hops of SSH

我需要将大约 4.2 GB 的文件从我的 local computer 传输到 server B。但是要通过 ssh 进入服务器 B,我需要通过 ssh 进入 server A.

目前我正在将文件从 local computer 复制到服务器 A,然后从 server A 复制到 server B

所以流程是这样的:

rsync -avz --del ~/Desktop/abc/ <my-user-name>@<server-A>:~/abc

rsync -avz --del ~/Desktop/abc/ <my-user-name>@<server-B>:~/abc

这很慢,需要将 4.2 GB 的数据复制两次而不是一次!

我可以将 rsync 的文件从我的本地计算机直接传输到 server B 吗?

您可以随时使用 ssh 和代理命令,这样您就可以透明地传输文件。使用此配置 (~/.ssh/config):

Host <server-A>
    User <user-A>

Host <server-B>
    User <user-B>
    ProxyCommand ssh <server-A> -W %h:%p

你可以调用你的rsync:

rsync -avz --del ~/Desktop/abc/ <server-B>:~/abc

数据将仅"routed"通过中间主机。

你想要的是使用port-forwarding转发ssh/rsync 服务器 B 服务器 A 上的备用端口(通常是端口 22),所以当你调用 rsync -e "ssh -p altport" serverA:/sourcedir /destdir 时,你实际上是在调用 rsync来自 serverB

在 StackExchange 和其他网站上有很多很好的指南。例如:

会让你开始。使用端口转发,您实际上是在使用 serverA 作为直通主机,因此您只需传输一次 4.2G。

是的,您可以直接复制文件(甚至文件夹),而无需在 contact/login 服务器 上制作任何中间副本,这是默认已知的机器外部世界,或联系以访问特定的本地网络。

下面是使用 scp 的简单演示,没有任何不必要的并发症。在本地机器上,只需执行以下操作:

$ scp -r -o ProxyCommand="ssh -W %h:%p your_username@contact-server.de" your_username@machine_name:/file/path/on/this/machine   ~/destination/path/to/save/the/copied/folder
  • -r 选项指示 scp 复制整个文件夹的内容。
  • your_username 不必在两台机器上相同。

如果成功,系统会要求您在两台计算机上输入 密码 以进行身份​​验证。

在上面的命令中,假设访问名为“machine_name”的机器的典型方式是通过联系服务器。


注:
上述命令也适用于将数据从 源远程机器(例如s)传输到目标远程机器[=45] =](比如 t)。在这种情况下,首先 ssh 到源远程机器 (s) 并导航到数据所在的路径。之后,您可以简单地将 of/treat 远程机器视为 local/source 机器 ,然后简单地使用上面列出的相同 scp 命令复制文件夹。

要复制单个文件,只需删除 -r 选项并提供您要复制的特定文件的路径。