我有两个远程主机。host1-
> 10.3.0.1
host2-> 10.3.0.2
都运行 ssh 服务器。
ssh 服务器监听 host1 上的端口 22 和 host2 上的端口 6969。现在,使用我的本地计算机,我需要将某些内容从 host1 复制到 host2,而无需通过 ssh 登录 host1 或 host2。例如,
scp [email protected]:/path/to/file [email protected]/path/to/file
我该怎么做呢?请注意,两个主机对 ssh 使用不同的端口。
答案1
在过去,scp
当调用(天真地)在远程系统之间复制文件非常不方便:例如,如果你写
scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt
scp
首先会ssh
在 remote1 上打开一个会话,然后从那里运行scp
到 remote2。要实现此功能,您必须在 remote1 上为 remote2 设置授权凭据。
相反,现代方法(“现代”是因为它仅在几年前实现,并且可能不是每个人都拥有 -capable -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如果没有上述配置,那么我们是否指远程1或者远程2,包含加密密钥的文件也是如此。这样 CLI 就保持了整洁和简单。
其次,使用-3
选项,如下:
scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt
该-3
选项指示scp
通过发出命令的 PC 路由流量,即使它是传输的第三方。这样,授权凭据必须仅驻留在发出命令的 PC 上,即第三方。
答案2
源和目标可以以 scp://[user@]host[:port][/path] 格式指定为 URI
因此你可以运行:
scp -3 scp://[email protected]:22/path/to/file scp://[email protected]:6969/path/to/file
答案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"
答案4
我知道,这个主题已经有几年了,但是 OpenSSH 8.4(发布于 2020-09-27)向 scp 和 sftp 添加了代理转发。
现在可以将文件从一个远程复制到另一个远程,而无需通过本地计算机路由或在第一台主机上提供凭据,以便对第二台主机进行身份验证。
scp -A user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt
警告!当第一个主机受到威胁或者您受到 mitm 攻击的影响时,使用代理转发是一个安全问题。