我经常将服务器置于救援模式,这显然会更改主机密钥。因此,在某些情况下,我知道 SSH 主机密钥将被暂时或永久更改。每次我需要执行以下操作:
ssh-keygeyn -R x.x.x.x
ssh x.x.x.x
并确认添加新密钥- 在救援模式下执行某些操作并重新启动服务器
ssh-keygen -R x.x.x.x
ssh x.x.x.x
如果需要并接受新的主机密钥
我想知道是否有人想出了一个智能别名,或者有一个 ssh 客户端的配置选项,在出现不同的主机密钥时要求替换当前主机密钥,或者只是暂时忽略该问题并继续。
答案1
解决方案 1
您可以在登录前使用命令扫描远程主机的新公钥ssh-keyscan
。
ssh-keygen -R x.x.x.x
ssh-keyscan x.x.x.x >> ~/.ssh/known_hosts
ssh x.x.x.x
然后,您可以从中创建一个脚本,使用主机作为参数并将其放入您的PATH
.
要检查公钥是否不同,您可以执行以下操作:
diff -q <(ssh-keygen -F x.x.x.x | sed '1d') <(ssh-keyscan x.x.x.x 2>/dev/null)
解决方案 2
现在,如果你的基础设施中有 DNS 服务器,你应该设置SSHFPDNS 记录以集中的方式处理您机器的公钥更改,避免到处自制脚本的麻烦。
检索要配置的 DNS 条目:
ssh-keygen -r /etc/ssh/ssh_host_key.pub
结果如下:
IN SSHFP 1 1 d3fa9bcf2d51979c53bcac2961f38b60e4e60886
IN SSHFP 2 1 f1f09814dd79eea523f490808cf3c096f1d1a432
简单解释一下:
- 第一个字段:IN = Internet 类别
- 第二个字段:SSHFP 记录类型
- 第三个字段:算法(1=RSA、2=DSA、3=ECDSA)
- 第四字段:指纹类型(1=SHA-1,2=SHA256)
在这些记录前面加上服务器名称作为前缀,并将其放入您的 DNS 配置中。
然后确保您的所有机器都能联系到您的 DNS 服务器/etc/resolv.conf
。
最后,将VerifyHostKeyDNS=yes
选项放入.ssh/config
每个服务器上的文件中。
答案2
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
会诱使ssh
它认为其密钥列表是/dev/null
,并且不会要求您确认将密钥“添加”到(不存在的)文件。这样做的好处是您不必将临时密钥添加到真实文件中。
您可以添加 bash 别名来使用它。
alias sshnk="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"