使用 rsync 或 scp 在 SSH 的多个级别或跃点上复制文件
Posted
技术标签:
【中文标题】使用 rsync 或 scp 在 SSH 的多个级别或跃点上复制文件【英文标题】:Copy file with rsync or scp over multiple level or hops of SSH 【发布时间】:2016-02-09 11:29:30 【问题描述】:我需要将大约 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
吗?
【问题讨论】:
"复制 4.2 GB 数据两次而不是一次!"好吧,由于您通过服务器 A 进行路由,因此您将始终“两次”传输数据,一次从本地传输到服务器 A,一次从服务器 A 传输到服务器 B(它们是否可以同时传输是另一个问题)。这就是路由的本质。 【参考方案1】:是的,您可以直接复制文件(甚至文件夹),而无需在 联系人/登录服务器上进行任何中间副本,默认情况下,该服务器是外界已知的机器,或 联系以访问特定的本地网络。
下面是使用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)传输到目标远程机器(比如t)。在这种情况下,首先ssh
到源远程计算机 (s) 并导航到数据所在的路径。之后,您可以简单地将远程机器视为/对待本地/源机器,然后简单地使用上面列出的相同scp
命令来复制文件夹。
要复制单个文件,只需删除 -r
选项并提供要复制的特定文件的路径。
【讨论】:
【参考方案2】:你想要的是使用 port-forwarding 从 server 转发 ssh/rsync 端口(通常是端口 22) B 到 服务器 A 上的备用端口,因此当您调用 rsync -e "ssh -p altport" serverA:/sourcedir /destdir
时,您实际上是从 serverB
调用 rsync。
StackExchange 和其他网站上有许多不错的操作指南。例如:
How to forward a port from one machine to another? 或 How To Forward Ports through a Linux Gateway with Iptables会让你开始。使用端口转发,您实际上是在使用 serverA 作为直通主机,因此您只需传输一次 4.2G。
【讨论】:
【参考方案3】:您始终可以将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
数据将仅通过中间主机“路由”。
【讨论】:
以上是关于使用 rsync 或 scp 在 SSH 的多个级别或跃点上复制文件的主要内容,如果未能解决你的问题,请参考以下文章
三十 rsync工具介绍rsync常用选项rsync通过ssh同步