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

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

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


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

评论

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

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

#1 楼

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

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


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

现代化的方法(“现代”,因为它是几年前才实现的,也许不是每个人都有一个-3-能力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选项,如下所示:通过发出命令的PC来路由流量,即使它是传输的第三方。这样,授权凭据必须仅驻留在发布PC上,即第三方。

评论


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

– Artur Czajka
2014年8月8日在8:13

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

–模数
2014-12-28 8:36



由于您不会像通常那样看到输出,因此,一个技巧是使用-v启用详细模式。

– holmberd
19年5月23日在21:49

这篇文章清楚地说:“通过第三台PC路由流量”,但是我至少没有将其解析为:“这将非常慢”。如果这是您需要的,则必须使用相关凭据设置remote1。不过,这是一次性的事情,那么它将起作用。

–Fons MA
20/07/29在8:04



如何在这里使用sshpass?我需要传递两台服务器的密码。

–西立酮
20/12/26在10:35

#2 楼

可以使用scp:// [user @] host [:port] [/ path]

形式将源和目标指定为URI,因此您可以运行:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file


评论


这就是答案。请注意,该路径在第一个/之后开始,因此,如果要使用绝对路径,则将//放在端口之后(例如scp://user@10.3.0.1:22 // etc / *),将被解释为本地用户家。您可以使用-v查看正在传输的文件,这在使用通配符时非常有用。

–万尼
20 Jun 4'13:17



#3 楼

上次尝试此操作时,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手册页上说:“还允许在两个远程主机之间复制。”

–格伦·杰克曼
2013年12月10日14:23

谢谢,很高兴听到。为了给scp提供一个-P标志(它是由某些BSD人士编写的,因为它的参数处理是如此悲惨:-(),但是看来您不能在远程主机上指定其他端口。但是我认为,仅剩下这种解决方法了(或者有很多棘手的解决方案,使用ssh但避免使用scp-例如sftpfs,但不是最简单的方法)。我通过端口设置扩展了解决方法。

–peterh-恢复莫妮卡
2013年12月10日15:11



#4 楼

在我的情况下,我正在执行远程到远程的复制,没有-3参数。 />
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?

–红瓶
18年8月30日在9:26