使用 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
选项并提供您要复制的特定文件的路径。
我需要将大约 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
选项并提供您要复制的特定文件的路径。