如何使用scp从第三方本地机器在两个远程服务器之间传输文件?

25
我正在尝试从我的本地机器将一个文件从一个远程服务器复制到另一个远程服务器。以下是我正在尝试做的事情。
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

任何建议?
6个回答

42
如果您可以从本地连接到远程服务器(本地 -> 远程1 和本地 -> 远程2),则可以尝试以下操作:
ssh -A -t user1@remote1 scp srcpath user2@remote2:destpath

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

如果您不想被要求输入密码,那么您应该在远程主机上设置authorized_keys文件。


3
需要注意的是,由于这将直接连接远程1和远程2,因此仅仅能够从本地通过ssh连接到远程2是不够的,你需要检查你是否可以从远程1 ssh到远程2(例如在远程1的~/.ssh/config中配置名称和设置)。 - Peteris
2
到目前为止,我看到的最好的解决方案。您不必授权服务器相互ssh,您只需要使用您的密钥访问它们两个即可。而且,与scp -3不同,数据直接在服务器之间复制,可能通过非常快速的本地网络进行传输。 - Leonid Beschastny
2
@LeonidBeschastny,你在瞎猜,这是不被欣赏的。如果你选择这样做,你将不得不拥有多个密钥文件,并降低安全性,你可能没有服务器在同一网络上。问题不是如何连接到一个远程服务器并传输到另一个,而是如何通过SCP进行远程到远程的传输。 - KatsuoRyuu
2
@RubenCaro:谢谢分享,但对我不起作用。错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). lost connection - Tung
4
这是一个错误的答案。只有在将user1@remote1的ssh公钥安装到user2@remote2的authorized_keys中时,该命令才会起作用。本地凭据将不会在scp中使用。 - sanigo
显示剩余6条评论

38

如果本地主机连接速度较慢,将-3添加到路由以通过本地主机路由流量是否会使事情变得非常缓慢? - wcochran
@wcochran 是的,它可以。但是很容易让它在所有情况下都起作用。我想知道是否有一种通用的方法来建立两个远程主机之间的直接SSH连接,而不会向任何一方公开任何秘密。 - sudo
无法工作……错误:目标地点的权限被拒绝(公钥)…….scp -3 -i /.ec2/${3} ubuntu@${1}:/auto_dump/backup_${orgin}_${timestamp}.dump -i /.ec2/${4} ubuntu@${2}:/auto_dump/ - Ebin Joy

6
在Linux终端中,可以使用以下命令来实现此操作:

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

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

user1@ip's password: user2@ip's password:

如果你按照顺序依次输入两个密码并在第一个密码后按回车键,则应该能够接受,但实际上不行。即使您再次按顺序输入两个密码,但在第一个密码后不按回车键,它也不会接受。

您必须先输入用户2的密码,然后按回车键,然后再输入用户1的密码并按回车键。这样才能成功。

我知道这听起来不对,但只有这样才有效。这是scp中的一个错误。

能否创建一个内部存储密码的Shell脚本? - sjd
取决于您的目标是什么?您想要进行scp还是ssh操作? - darecoder
在我的Ubuntu 18.04终端上,第一次输入的密码(用于user2)没有回显,但是第二次输入的密码(用于user1)以明文形式显示! - studog

2
我发现-o "ForwardAgent yes"可以解决问题:
localA $ scp -o "ForwardAgent yes” userB@remoteB:/path/to/file userC@remoteC:/path

我更喜欢这个比-3,因为我不想要一个中间的机器减慢速度。我也喜欢@RubenCaro的答案,但这个更直接。


1
对我来说不起作用。错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). lost connection。有什么线索吗?谢谢! - Tung
对我来说可以用私钥:scp -o 'ForwardAgent yes' -i localkey.pem userB@remoteB:/path/to/file userC@remoteC:/path . - brunesto

1
如果您没有在authorized_keys文件中有条目,则只需要密码。一旦您已经登录到两个服务器(localA->remoteB和remoteB->remoteC)并建立了安全连接,您的原始命令应该可以工作。

你好,我仍然无法做到这一点,因为我正在使用ClearCase。但是你的提示非常好。authorized_keys与~/.ssh/config和别名结合起来更快。谢谢。 - Alan

1
现有的答案假设您可以从远程机器ssh回本地机器。但这并非总是可能的。在这种情况下,您可以使用跳板机制。实际上,这样更有效率。
如果您使用的是最近版本的OpenSSH(8.0),则可以使用-J(跳转)开关
scp -J user@intermediate user@target:/path

对于旧版本(至少为7.3),您可以在命令行上使用{{link1:ProxyJump指令}},例如:

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

或者在 ssh_config 文件中。

还有其他选项,例如ProxyCommand或端口转发,您甚至可以在旧版OpenSSH上使用。这些内容在OpenSSH是否支持多跳登录?中有介绍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接