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

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

我有两个远程主机。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 -3scp需要两个步骤。第一个必要步骤是使用~/.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 攻击的影响时,使用代理转发是一个安全问题。

相关内容