是否可以从SSH的known_hosts文件中删除特定的主机密钥?

是否可以从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中删除条目:

 ssh-keygen -R hostname 

是的,您只需删除一个密钥即可。 只需在编辑器中打开它并删除有问题的行。 错误消息中冒号后面的数字是行号,因此这是要删除的行 – 示例中的第1行。

我刚刚开始使用主机密钥,但是当我搞乱它们时,它通常每行一个密钥,所以备份文件并一次删除一个,直到找到正确的密钥。 然后添加其他人。 要做到这一点还有很长的路要走,但应该有效。

也基于该错误,并且不知道是什么,它可能是文件中的第一个主机密钥是问题所以用vim打开文件

vim ~/.ssh/known_hosts

并击中

dd

然后保存它。

使用ssh-keygen -R hostname并不总是有效。 如果你有一个较新版本的SSH“隐藏”主机名以防止ssh-agent劫持,显然ssh-keygen无法取消主机名。

例如,我有一个名为build-node-01的主机,我已经连接到它并接受了密钥。 然后我从头开始重建它,得到一个新的主机指纹,我尝试重新连接,我会收到一条警告,说X行(比如说3)有冲突。 我运行ssh-keygen -R hostname ,但是下次我尝试连接时,我仍然会收到一个警告,说明存在冲突。 我检查了文件只是为了发现主机名被哈希并显示为[1] Bu4Ch@R@4D0M57uFF而不是可读的主机名。

在这种情况下,成功获取违规主机的唯一方法是使用

 sed -i 'xd' ~/.ssh/known_hosts 

为了更进一步,你可能希望备份known_hosts,以防你删除错误的行,在这种情况下只需将.bak(或任何扩展名)添加到-i选项以创建一个备份延期。 使用ssh-keygen会自动执行此操作。

 sed -i.bak 'xd' ~/.ssh/known_hosts 

只是为了分享我刚刚发现的另一个干净而简单的答案。 正在删除主机名,因为known_hosts文件已经过哈希处理。 但是,我可以根据错误消息中的行号手动编辑主机条目。 正如之前Mike Scott所述,违规主机名行号在错误消息中。

或者,我可以做到这一点。 从这里: 如何修复ssh known_hosts文件中的违规密钥

我得到了一点cli魔法

 sed -i 'xd' ~/.ssh/known_hosts 

用行号替换x,然后瞧。 如果sed不起作用,他还会提供perl答案。

 sed '/10\.20\.120\.211/d' ~/.ssh/known_hosts > temp && mv temp ~/.ssh/known_hosts 

在这种情况下,10.20.120.211是我要从known_hosts文件中删除的主机,请确保转义特殊字符,如(。)