【发布时间】: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。我缺少什么以及如何使其发挥作用?
【问题讨论】: