从远程会话中运行时,SSH 复制 ID 失败



我有一个任务是将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。我缺少什么以及如何使其工作?

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,它将提示用户(您)进行主机密钥确认等操作。

ssh-copy-id

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

确保在目标端,/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-rsa,它systemctl restart sshd起作用了!

最新更新