从我的(第三台)个人计算机在两个远程主机之间进行scp


136

我有两个远程主机。
host1-> 10.3.0.1
host2-> 10.3.0.2
都运行ssh服务器。

ssh服务器侦听主机1中的端口22和主机2中的端口6969。现在,使用本地计算机,我需要将某些内容从host1复制到host2,而无需通过ssh登录到host1或host2。就像是,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

我该怎么做,请注意两个主机使用不同的ssh端口。


您是在问是否可以从远程主机转移到远程主机,还是在不提供密码的情况下询问如何做?
glenn jackman 2013年

虽然-P存在用于指定要使用的端口的标志,但在远程到远程传输的情况下,ssh是未定义有关如何指定每个主机端口的行为...
mveroone 2013年

Answers:


216

过去,scp天真地)调用远程系统之间复制文件的工作方式非常不方便:例如,如果您编写

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scp首先ssh会在remote1上打开一个会话,然后scp从那里运行到remote2。为此,您必须在remote1上为remote2设置授权凭证。

相反,现代的方法(“现代”是因为它是在几年前才实施的,也许并不是每个人都具有-3-capable scp)需要两个步骤。第一步是使用~/.ssh/config来设置用于连接remote1和remote2的所有选项,如下所示:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

这样就可以毫无歧义地将所有必要的选项传递给命令:例如,如果我们在CLI上说使用端口2222而不进行上述配置,则不清楚是要引用remote1还是remote2,并且对于包含加密密钥的文件也是如此。这样,CLI保持整洁和简单。

其次,使用该-3选项,如下所示:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

-3选项指示scp通过发出命令的PC路由流量,即使它是传输的第三方。这样,授权凭证必须仅驻留在发行PC上,即第三方。


6
供将来参考:如果在共享身份文件的两个主机之间复制文件(例如EC2实例),则不需要配置文件。一个-i参数足以连接到两个主机。
Artur Czajka 2014年

1
同样值得注意的是,对于Google Compute Engine,支持将其添加到您的~/.ssh/config文件中:cloud.google.com/compute/docs/gcloud-compute,但我认为AWS不提供相同的支持

1
由于您不会像平常一样看到输出,因此建议您使用启用详细模式-v
Holmberd

5

上次我尝试此操作时,scp无法执行该操作。您的命令行看起来还可以。此解决方法将起作用:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

我的scp手册页上说:“还允许在两个远程主机之间复制。”
glenn jackman 2013年

1
谢谢,很高兴听到。为了给scp提供一个-P标志(它是由某些BSD人士编写的,因为它的参数处理是如此悲惨:-(),但是看来您不能在远程主机上指定其他端口。对不起,但我认为,只有这种解决办法左派(或有很多棘手的解决方案,使用ssh但避免SCP -例如,sftpfs,但它们不是简单的)。我伸出我的解决方法与端口设置。
peterh

4

就我而言,我正在做一个从远程到远程的复制,没有-3争论。参数“ -P”给定的端口与第一台服务器一起使用,而端口22与第二台服务器一起使用。

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

解决方案是在其中编辑/etc/ssh/ssh_config文件server1并添加以下行:

Host *.otherdomain.com
   Port  1234

这样,端口1234就会同时用于两者。也可能会有所不同。

由于通信是直接的,因此该解决方案比以前的解决方案具有更好的吞吐量。


perez是否可以通过comman线路通过两个不同的远程机器的两个不同的端口来实现scp?
Red Bottle '18

3

可以将源和目标指定为URI,形式为scp:// [user @] host [:port] [/ path]

这样就可以运行:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.