如何使用来自第三台本地计算机的 scp 在两个远程服务器之间传输文件?

How to transfer a file between two remote servers using scp from a third, local machine?

我正在尝试从我的本地远程服务器将文件复制到另一台远程服务器机器。 这是我正在尝试做的事情

localA $ scp userB@remoteB:/path/to/file userC@remoteC:/path

问题是我需要为远程机器上的 userB 和 userC 传递两个密码。

根据 Garron 以上内容应该可以,但我的权限被拒绝了。

Permission denied (gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive).
lost connection

有什么建议吗?

只有在 authorised_keys 文件中没有条目时才需要密码。登录到 2 个服务器(localA -> remoteB 和 remoteB -> remoteC)并建立安全连接后,你的原始命令应该可以工作。

这可以在 linux 终端中使用以下命令行:

scp -3 user1@ip:path/from/directory/ user2@ip:path/to/directory

将出现要求输入密码的提示,如下所示:

user1@ip的密码:user2@ip的密码:

如果您在第一个密码后按回车键按顺序输入两个密码,它应该会接受但不会。即使您按顺序再次输入两个密码,但在第一个密码后不按回车键,它也不会再次接受。

您必须先输入用户 2 的密码,然后按回车键,然后输入用户 1 的密码并按回车键。这会起作用。

我知道这听起来不对,但只有这样才能奏效。这是 scp.

中的一个 bug

如果您可以从本地(本地 -> remote1 和本地 -> remote2)ssh 到两个远程服务器,那么您可以尝试:

ssh -A -t user1@remote1 scp srcpath user2@remote2:destpath

这将使用您的本地凭据直接从 remote1 传输到 remote2

如果您不想被要求输入密码,那么您应该在遥控器上设置 authorized_keys 文件。

超级用户已经存在此问题:

https://superuser.com/questions/686394/scp-between-two-remote-hosts-from-my-third-pc

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

如所述 -3 选项指示 scp 通过发出命令的 PC 路由流量。

如果 remote1 和 remote2 在同一网络上,则上述内容成立。

如果不是:- 你必须使用端口转发

我发现 -o "ForwardAgent yes” 可以解决问题:

localA $ scp -o "ForwardAgent yes” userB@remoteB:/path/to/file userC@remoteC:/path

我比 -3 更喜欢这个,因为我不希望中间机器减慢速度。我也喜欢@RubenCaro 的回答,但这似乎更直接。

现有答案假设您可以从远程机器通过 ssh 返回本地机器。这并不总是可能的。在这种情况下,您可以使用 jump host mechanism。无论如何,它实际上更有效率。


如果您有最新的 OpenSSH (8.0),您可以使用 -J (jump) switch:

scp -J user@intermediate user@target:/path

对于旧版本(但至少是 7.3),您可以使用 ProxyJump directive,或者在 command-line:

scp -o ProxyJump=user@intermediate user@target:/path

或在 ssh_config 文件中。


还有其他选项,例如 ProxyCommand 或端口转发,您甚至可以在更旧版本的 OpenSSH 上使用它们。这些都包含在 Does OpenSSH support multihop login?