我有一个任务是将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
选项的情况下运行,它将从您的~/.ssh
dir 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
起作用了!