【问题标题】:ssh-copy-id fails when run from within a remote session从远程会话中运行 ssh-copy-id 失败
【发布时间】:2020-12-16 05:46:43
【问题描述】:

我的任务是将 ssh 密钥从一个节点复制到数组中的所有其他节点。为此,我编写了一个简单的 bash 脚本,它将自身复制到其他节点并在那里运行。让我感到困惑的是,ssh-copy-id 在手动执行脚本的节点上工作正常,但如果在 ssh 会话中远程运行,它会失败。这是脚本:

1   #!/bin/bash
2   # keys-exchange.sh

4   nodes=( main worker-01 worker-02 worker-03 )

6   for n in $( echo "${nodes[@]}" ); do
7     [ $n != $HOSTNAME ] && ssh-copy-id $n
8   done

10  if [ -z $REMOTE ]; then
11    for n in $( echo ${nodes[@]} ); do
12      if [ $n != $HOSTNAME ]; then
13        scp $0 $USER@$n:$0 > /dev/null
14        ssh $USER@$n "REMOTE=yes HOSTNAME=$n $0 ; rm -f $0"
15      fi
16    done
17  fi

第 6-8 行的代码可以很好地将 ssh 密钥复制到除自身之外的所有节点。然后,如果未设置 REMOTE 变量,第 11-16 行中的代码会将脚本复制到远程节点(运行它的节点除外,第 12 行)并在那里运行它。在第 14 行中,我设置并传递变量 REMOTE 以跳过第 10-17 行中的代码块(因此脚本仅将自身从源节点复制到其他节点)和变量 HOSTNAME,因为我发现它没有在 ssh 会话中设置.用户名和脚本路径在源节点和所有目的节点上完全相同。

在源节点上运行时,它可以正常工作,要求确认和远程主机的密码。但是刚刚在源节点上成功运行的脚本在远程ssh会话中运行失败:ssh-copy-id失败,错误如下:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/username/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: ERROR: Host key verification failed.

此时,远程节点上没有 .ssh/known_hosts 文件,因此我无法执行 ssh-keygen -R。我缺少什么以及如何使其发挥作用?

【问题讨论】:

    标签: linux bash ssh


    【解决方案1】:

    确保在目标端,/etc/ssh/sshd_config 配置为接受生成的密钥类型。

    PubkeyAcceptedKeyTypes ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa

    我使用ssh-keygen -t rsa -b 4096 ... 生成了密钥,但是,在下面一行的上方没有在末尾包含,ssh-rsa,所以即使 ssh-copy-id 更新了我的目的地, sshd 不接受 rsa 类型生成的密钥。一旦我添加了,sha-rsasystemctl restart sshd 就起作用了!

    【讨论】:

      【解决方案2】:
      ssh $USER@$n "REMOTE=yes HOSTNAME=$n $0 ; rm -f $0"
      

      尝试使用“-tt”选项运行ssh,为远程会话请求 PTY(伪 TTY):

      ssh -tt $USER@$n "REMOTE=yes HOSTNAME=$n $0 ; rm -f $0"
          ^^^
      

      在您所描述的情况下,您将在远程系统上启动 ssh 以连接到第三个系统。 ssh 实例没有第三个主机的主机密钥的保存副本。所以你通常期望ssh 提示用户是否继续连接到第三台主机。除了它没有提示用户——它只是拒绝连接到第三台主机。

      当使用要在远程系统上运行的命令调用 ssh 时,默认情况下它会在没有 TTY 的情况下运行该命令。在这种情况下,远程 ssh 实例发现它在没有 TTY 的情况下运行并且以非交互方式运行。当它是非交互式时,它不会提示用户输入密码以及是否接受主机密钥等信息。

      使用“-tt”运行本地 ssh 实例会导致它为远程会话请求 PTY。所以远程 ssh 实例将有一个 TTY,它会提示用户——你——进行主机密钥确认等操作。

      【讨论】:

      • 谢谢@Kenster,这正是我一直在寻找的!
      【解决方案3】:

      ssh-copy-id 不会将您的密钥复制到远程主机,而是将它们添加到~/.ssh/authorized_keys 并且当您跳转到该远程主机时没有密钥(或者它们是?)所以没有什么可以进一步复制。如果ssh-copy-id 在没有-i 选项的情况下运行,它将复制(添加到authorized_keys)您的~/.ssh 目录中的所有.pub 密钥,这可能是不需要的,所以我建议像这样运行它ssh-copy-id -i $key $host

      【讨论】:

      • 是的,我知道。但是,当脚本尝试将密钥传输给其他节点时,密钥已经在远程节点上,并且在那里运行的脚本应该在本地找到它们。不管怎样,谢谢你的帮助。
      猜你喜欢
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2023-01-25
      相关资源
      最近更新 更多