【问题标题】:How to transfer a file between two remote servers using scp from a third, local machine?如何使用来自第三台本地计算机的 scp 在两个远程服务器之间传输文件?
【发布时间】:2020-09-08 19:40:07
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

    标签: unix ssh scp


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 需要注意的是,由于这将 直接 从 remote1 连接到 remote2,因此能够从本地通过 ssh 连接到 remote2 是不够的,您需要检查您是否可以从 remote1 SSH 到 remote2(例如,远程 1 上的 ~/.ssh/config 中的名称和配置)
    • 迄今为止我见过的最好的解决方案。您不必将服务器授权给彼此ssh,您所需要的只是使用您的密钥访问它们。与scp -3 不同的是,数据直接在服务器之间复制,可能通过非常快的本地网络。
    • @LeonidBeschastny 你在做猜测,不被欣赏。您将必须拥有多个密钥文件(如果您选择),并且这样会降低安全性,您可能不在同一网络上拥有服务器。问题不是我如何连接到一个遥控器并转移到另一个。这是我如何通过 scp 进行远程到远程传输。
    • @RubenCaro:感谢分享,但它对我不起作用。错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). lost connection
    • 这是一个错误的答案。仅当 user1@remote1 的 ssh pub 密钥安装在 user2@remote2 的 authorized_keys 中时,该命令才有效。 scp 中不会使用本地凭据。
    【解决方案2】:

    超级用户已经存在这个问题:

    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 在同一个网络上,上述情况是正确的。

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

    【讨论】:

    • 如果本地主机的连接速度很慢,是否添加 -3 以通过本地主机路由流量真的会减慢速度?
    • @wcochran 是的,确实如此。但是很容易让它在所有情况下都有效。我想知道是否有一种通用的方法可以在两个远程主机之间建立直接 SSH 连接,并且不会向任何一个主机公开任何秘密。
    • NOT WORKING....error Permission denied (publickey) for destination............scp -3 -i ~/.ec2/${3} ubuntu@ ${1}:~/auto_dump/backup_${orgin}_${timestamp}.dump -i ~/.ec2/${4} ubuntu@${2}:~/auto_dump/
    【解决方案3】:

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

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

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

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

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

    你必须先给 user2,然后按 enter,然后输入 user1 的密码,然后按 enter。这将起作用。

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

    【讨论】:

    • 是否可以创建一个shell脚本,其中也存储了密码?
    • 视情况而定!你的目标是什么?你想做 scp 还是 ssh?
    • 在我的 Ubuntu 18.04 终端上,第一次输入的密码(用于 user2)没有回显,但是,第二次输入的密码(用于 user1)以纯文本形式出现!
    【解决方案4】:

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

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

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

    【讨论】:

    • 它对我不起作用。错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). lost connection。有什么线索吗?谢谢!
    • 为我工作(使用私钥): scp -o 'ForwardAgent yes' -i localkey.pem userB@remoteB:/path/to/file userC@remoteC:/path .
    【解决方案5】:

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

    【讨论】:

    • 您好,我相信我仍然不能这样做,因为我使用的是 clearcase。但是你的小费很棒。 authorised_keys 与 ~/.ssh/config 和和别名结合起来要快得多。谢谢
    【解决方案6】:

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


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

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

    对于旧版本(但至少为 7.3),您可以在命令行中使用 ProxyJump directive

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

    或在ssh_config 文件中。


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

    【讨论】:

      最近更新 更多