来自我的(第三台)电脑的两个远程主机之间的 scp

uwa*_*him 184 networking linux ssh shell scp

我有两个远程主机。
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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*iae 290

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

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt
Run Code Online (Sandbox Code Playgroud)

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

  • 供将来参考:如果您在共享身份文件(如 EC2 实例)的两台主机之间复制文件,则不需要配置文件。一个 -i 参数足以连接到两台主机。 (15认同)
  • 由于您不会像往常一样看到输出,因此提示是使用 `-v` 启用详细模式。 (2认同)
  • @FonsMA 通常,慢一点比向不应该拥有凭证的服务器提供凭证要好。 (2认同)

小智 31

源和目标可以指定为 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
Run Code Online (Sandbox Code Playgroud)

  • **这就是答案。** 请注意,路径在第一个 `/` 之后开始,所以如果你想要一个绝对路径,你可以将 `//` 放在端口之后(例如 `scp://user@ 10.3.0.1:22//etc/*`),否则它会被解释为用户家本地。您可以使用 `-v` 来查看正在传输的文件,这在使用通配符时非常有用。 (4认同)
  • @Vanni,文字并不能描述您的简单注释`o,如果您想要一个绝对路径,您将在端口后面添加//(例如scp://user@10.3.0.1:22//etc/*),或者它会被解释为用户家中的本地内容`只是有帮助......正是因为这个原因,我浪费了几乎一整天的时间来拔头发。在找到这个之前我一定已经阅读了互联网上有关 SCP 的其他内容......谢谢!! (4认同)

pet*_*erh 8

上次我尝试这样做时,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"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,很高兴听到。你可以给 scp 一个 -P 标志(它是由一些 BSD 人写的,这是因为它的参数处理太悲惨了 :-( ),但似乎你不能在远程主机上指定不同的端口。对不起,但我认为,只剩下这个解决方法(或者有很多更棘手的解决方案,使用 ssh 但避免使用 scp - 例如,sftpfs,但它们不是最简单的)。我使用端口设置扩展了我的解决方法。 (2认同)

dav*_*rez 5

在我的情况下,我正在做一个远程到远程复制,没有-3参数。'-P' 参数给出的端口适用于第一台服务器,但端口 22 用于第二台服务器。

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com
Run Code Online (Sandbox Code Playgroud)

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

Host *.otherdomain.com
   Port  1234
Run Code Online (Sandbox Code Playgroud)

这样,1234端口就用于他们俩了。也可以不一样。

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