如何与第二个远程主机scp

我想知道是否有一种方法可以让我通过remote1主机直接从本地机器上从remote2主机传送文件。

networking只允许从remote1主机连接到remote2主机。 而且,remote1主机和remote2主机都不能scp到我的本地机器。

有没有像这样的东西:

scp user1@remote1:user2@remote2:file .

第一个窗口: ssh remote1 ,然后是scp remot2:file .

第二个shell: scp remote1:file .

第一个窗口: rm file; logout rm file; logout

我可以写一个脚本来完成所有这些步骤,但如果有直接的方法,我宁愿使用它。

谢谢。

编辑:我想像打开SSH隧道,但我很困惑什么价值放在哪里。

目前,要访问remote1 ,我的本地机器上有$HOME/.ssh/config

 Host remote1 User user1 Hostname localhost Port 45678 

一旦在remote1 ,要访问remote2 ,它是标准的本地DNS和端口22.我应该把remote1和/或在localhost更改什么?

我不知道有什么方法可以直接在一个命令中拷贝文件,但是如果你可以承认在后台运行一个SSH实例来保持端口转发隧道的开放,那么你可以用一个命令拷贝这个文件。

喜欢这个:

 # First, open the tunnel ssh -L 1234:remote2:22 -p 45678 user1@remote1 # Then, use the tunnel to copy the file directly from remote2 scp -P 1234 user2@localhost:file . 

请注意,您在实际的scp命令中以user2@localhost身份连接,因为它位于localhost上的端口1234上,即第一个ssh实例正在侦听转发连接到remote2 。 另请注意,您不需要为每个后续文件副本运行第一个命令; 你可以简单地让它运行。

ssh

即使在复杂的情况下,您也可以使用单一命令行处理文件传输,只需使用ssh 😉
如果remote1无法连接到localhost ,这是非常有用的:

 ssh user1@remote1 'ssh user2@remote2 "cat file"' > file 

tar

但是,你松散的文件属性(所有权,权限…)。

然而, tar是保持这些文件属性的朋友:

 ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x 

您也可以压缩以减lessnetworking带宽:

 ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj 

而且tar还允许你通过基本的ssh传递一个recursion目录:

 ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj 

ionice

如果文件很大并且不想打扰其他重要的networking应用程序,则可能会错过由scprsync工具提供的networking吞吐量限制 (例如, scp -l 1024 user@remote:file不会使用超过1 Mbits /秒) 。

但是,一个解决方法是使用ionice保留一个命令行:

 ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file 

注意:旧版本可能无法使用ionice

这将做的伎俩:

 scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' user@remote2:path/to/file . 

直接从主机remote2 SCP文件中添加两个选项( HostProxyCommand )到你的〜/ .ssh / config文件中(另见超级用户的答案)。 然后你可以运行:

 scp user@remote2:path/to/file . 

从您的本地机器,而不必考虑remote1