如何与第二个远程主机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应用程序,则可能会错过由scp
和rsync
工具提供的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文件中添加两个选项( Host
和ProxyCommand
)到你的〜/ .ssh / config文件中(另见超级用户的答案)。 然后你可以运行:
scp user@remote2:path/to/file .
从您的本地机器,而不必考虑remote1
。