先把当时的情况摆出来。一台机器重装系统,IP 没变,本地再次 ssh 时直接报 REMOTE HOST IDENTIFICATION HAS CHANGED 并拒绝连接,脚本里的 scp 也全部失败。
真正麻烦的地方在于,几个原因的现象几乎一样。重装后 sshd 重新生成了主机密钥,和本地 known_hosts 里记录的不一致。另一种情况是同一 IP 被分配给了另一台机器,密钥自然不同。
少数情况下是中间有设备做 SSH 代理,返回的是它自己的主机密钥。不容易想到的是,known_hosts 里同时存在新旧两条记录。
上来先看冲突的是哪一条记录
ssh-keygen -F 10.0.0.21
然后确认新密钥指纹后再删除旧记录
ssh-keygen -R 10.0.0.21
随后重新连接并核对指纹
ssh -o StrictHostKeyChecking=accept-new root@10.0.0.21
批量脚本里改用独立的 known_hosts 文件
ssh -o UserKnownHostsFile=/tmp/kh -o StrictHostKeyChecking=no root@10.0.0.21 true
怎么算真的好了,看的是同一批现象。ssh 能正常登录且不再提示密钥变更,ssh-keygen -F 只返回一条新记录,批量脚本执行恢复正常。
别直接关掉 StrictHostKeyChecking 了事,先核对指纹再接受;云主机重建频繁的场景可以用固定的主机密钥镜像或者自动化维护 known_hosts。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
