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使用不同的端口。
#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
评论
您是在问是否可以从远程主机转移到远程主机,还是在不提供密码的情况下询问如何做?尽管存在-P标志以指定要使用的端口,但在远程到远程传输的情况下,ssh是关于如何指定每个主机端口的未定义行为...