最近在学写shell脚本,准备给各服务器批量做ssh互信。
测试给各服务器root做免密没问题,但给普通用户设置免密就出问题了:私钥创建成功但copy就提示秘钥验证失败??各服务器ssh端口一致用户名密码都一致,这个验证失败着实想不明白。身边没有技术支持,只能来CSDN转转了,期望能解惑,先行谢过啦
脚本:
报错关键字:/bin/ssh-copy-id: ERROR: Host key verification failed.
最近在学写shell脚本,准备给各服务器批量做ssh互信。
测试给各服务器root做免密没问题,但给普通用户设置免密就出问题了:私钥创建成功但copy就提示秘钥验证失败??各服务器ssh端口一致用户名密码都一致,这个验证失败着实想不明白。身边没有技术支持,只能来CSDN转转了,期望能解惑,先行谢过啦
脚本:
报错关键字:/bin/ssh-copy-id: ERROR: Host key verification failed.
引自免费微信小程序:皆我百晓生
根据您提供的信息,看起来您在尝试为普通用户(例如hadoop)设置SSH免密登录时遇到了问题。错误消息提到Host key verification failed
,这通常意味着目标主机的SSH公钥指纹与您的本地主机上存储的指纹不匹配。要解决这个问题,您可以按照以下步骤操作:
确保所有服务器上的SSH服务已经启动并且监听正确的端口(这里是10022)。检查 /etc/ssh/sshd_config
文件,并确保 Port
行设置为10022。
首先,手动登录每个目标服务器,确认其SSH公钥指纹是否正确。运行以下命令:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
记录每个服务器返回的指纹。
在您的本地机器上,找到~/.ssh/known_hosts
文件(对于root用户可能是/root/.ssh/known_hosts
),并删除与这些服务器相关联的条目。注意,在某些系统中,此文件可能具有严格的权限,您可能需要以root身份进行编辑。
重新执行您的脚本,当遇到Host key verification failed
提示时,选择yes
接受新的主机密钥。
以下是修改后的脚本,添加了一个选项让用户手动接受新的主机密钥:
#!/bin/bash
# ... 其他部分保持不变 ...
echo "检测到正在为普通用户配置免密登录"
sleep 3
if [ -f "/home/$user/.ssh/id_rsa" ]; then
echo "suser用户秘钥已存在"
else
echo "创建$user用户秘钥"
su - $user -c "ssh-keygen -t rsa -b 2048 -D /home/$user/.ssh/id_rsa"
echo "将$user用户公钥分发至指定服务器..."
sleep 3
for copy2 in $(echo "$HOST" | tr ',' ' '); do
expect <<- EOF
spawn su - $user -c "ssh-copy-id -p$port $user@$copy2"
expect "password:"
send "$user_pass\r"
"(yes/no)?" {
send "yes\n"
exp_continue
}
expect "*?assword:*"
send "$user_pass\r"
expect eof
EOF
done
fi
exit 0
在这个版本的脚本中,我增加了对目标服务器密码的输入提示,并且在expect
块中处理了两次密码提示(第一次是ssh-copy-id
的密码,第二次是目标服务器的密码)。这样应该可以绕过Host key verification failed
的问题。如果仍然有问题,请检查您的网络环境和防火墙设置。