是否可以从 SSH 的 known_hosts 文件中删除特定的主机密钥?
我通常最终会删除整个known_hosts
文件,我这样做没有问题,但出于好奇,是否可以只删除一个条目?
我打开了known_hosts
文件,但我很难理解它的内容。
以下是我面临的信息,这导致我提出了这个问题:
Add correct host key in /home/wissen16/.ssh/known_hosts to get rid of this message.
Offending key in /home/wissen16/.ssh/known_hosts:1
RSA host key for foo.com has changed and you have requested strict checking.
Host key verification failed.
使用此命令从 known_hosts 中删除条目:
是的,您只能移除一把钥匙。只需在编辑器中打开它并删除有问题的行。错误消息中冒号后面的数字是行号,所以这是要删除的行——在你的例子中是第 1 行。
我最近才开始使用主机密钥,但是当我弄乱它们时,通常每行一个密钥,所以备份文件并一次删除一个,直到找到正确的。然后把其他的加回来。要做到这一点还有很长的路要走,但应该可以。
同样基于该错误,并且不知道是什么,它可能是文件中的第一个主机密钥是问题,所以用 vim 打开文件
vim ~/.ssh/known_hosts
并击中
dd
然后保存它。
使用 ssh-keygen -R 主机名并不总是有效。如果您有更新版本的 SSH 来“隐藏”主机名以防止 ssh-agent 劫持,显然 ssh-keygen 无法取消对主机名的哈希处理。
例如,我有一个名为 build-node-01 的主机,我已连接到它并接受了密钥。然后我从头开始重建它,获得一个新的主机指纹并尝试重新连接,我会收到一条警告,提示 X 行存在冲突(比如 3)。我跑
ssh-keygen -R hostname
了,但下次我尝试连接时,我仍然收到警告说存在冲突。我检查了文件只是发现主机名被散列并显示为[1] Bu4Ch@R@4D0M57uFF
而不是可读的主机名。在这种情况下,成功移除违规主机的唯一方法是使用
为了使 sed 更进一步,您可能希望备份 known_hosts 以防删除错误的行,在这种情况下,只需将 .bak (或任何扩展名)添加到 -i 选项以使用该选项创建备份扩大。使用 ssh-keygen 会自动执行此操作。
只是为了分享我刚刚找到的另一个干净简单的答案。删除主机名对我来说是不可能的,因为 known_hosts 文件是散列的。但是,我可以根据错误消息中的行号手动编辑主机条目。正如 Mike Scott 之前所指出的,有问题的主机名行号在错误消息中。
或者,我可以做到这一点。从这里开始:如何修复 ssh known_hosts 文件中的违规密钥
我有一点 cli 魔法
将 x 替换为行号,瞧。如果 sed 不起作用,他还提供了 perl 答案。
如果您想删除某些 IP 的主机密钥,那么这将有所帮助:
ssh-keygen -f "~/.ssh/known_hosts" -R "49.12.89.136"
要删除有问题的条目是这样的
我拼凑了下面的scipt。只需将其保存为 ~/.rmhost
然后把这个别名放在 ~/.bashrc
别名 rmhost=~/.rmhost
当您收到错误时,只需输入“rmhost {ipaddr|hostname}”
这个对我有用。这是尝试添加已知主机时显示的默认方法。
只需在此处更改 IP 地址和主机文件路径。
在这种情况下,10.20.120.211 是我要从我的 known_hosts 文件中删除的主机,请确保您转义了特殊字符,例如 (.)
您可以通过更新来避免删除特定主机:
这样您就不必再次连接到主机。