是否可以从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.


#1 楼

使用此命令从known_hosts中删除条目:

ssh-keygen -R hostname


评论


它也可以使用IP地址。例如,我有一个Web服务器的DNS主机快捷方式。为了消除自定义主机名的密钥和IP地址之间的冲突,我必须除去两者的条目。因此ssh-keygen -R xxx.xxx.xxx.xxx。

– StrangeElement
2012年11月13日在21:10

就像@StrangeElement所说的那样,有时候您必须同时删除IP主机(主机名除外)。

–曹刚扎
2015年2月10日在9:05

另外,它会自动保留备份(在我的osx机器上:原始内容保留为/Users/nha/.ssh/known_hosts.old,假设与Ubuntu相同)。

–那霸
2015年11月24日13:37



另外,如果您使用的是非标准ssh端口,请使用以下格式ssh-keygen -R [ssh.sssshh.com]:1234

– Shiji.J
2015年12月10日,0:04

这个问题的最佳答案。奇迹般有效

– Bademba
17 Mar 10 '17 at 9:31

#2 楼

是的,您只能删除一个键。只需在编辑器中将其打开,然后删除违规行即可。错误消息中冒号后面的数字是行号,因此这是要删除的行-在您的示例中是行1。.

评论


我不知道它确定了行号,这是非常有用的。

– deltree
2015年2月25日在17:07

#3 楼

我最近才开始使用主机密钥,但是当我弄乱它们时,通常每行只有一个密钥,因此备份文件并一次删除一个,直到找到正确的密钥为止。然后添加其他人。

还有很长的路要走,但是应该可以。

也基于该错误,并且不知道发生了什么,它可能是文件中的第一个主机密钥,因此用vim打开文件

vim ~/.ssh/known_hosts

并点击

dd

然后保存。

评论


您可以在vim中使用:set nu显示行号。无论如何,Takkat的答案是最好的。

–哈维尔·里维拉(Javier Rivera)
2011年1月10日10:46



我同意不知道您可以这样做。将来会使用它。我一直想查找vim的行号设置。谢谢。

–巴蒂·林赛(Buddy Lindsey)
2011年1月10日21:17

#4 楼

使用ssh-keygen -R主机名并不总是有效。如果您具有“隐藏”主机名以防止ssh-agent劫持的较新版本的SSH,显然ssh-keygen无法取消散列该主机名。例如,我有一个名为build的主机。 -node-01,我已经连接到它并接受了密钥。然后,我从头开始重建它,得到一个新的主机指纹,然后尝试重新连接,我将收到一条警告,提示X行存在冲突(例如3)。我运行ssh-keygen -R hostname,但是下次尝试连接时,仍然收到警告,提示存在冲突。我检查了文件后才发现主机名已被散列并显示为[1] Bu4Ch@R@4D0M57uFF而不是可读的主机名。

在这种情况下,成功删除有问题的主机的唯一方法是使用

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


要使此sed更进一步,如果您删除了错误的行,您可能希望备份known_hosts,在这种情况下,只需添加.bak(或-i选项以创建具有该扩展名的备份。使用ssh-keygen可以自动执行此操作。

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


评论


这是不正确的。 ssh-keygen -R {hostname}将起作用,即使主机名被“隐藏”(散列)也是如此。还是可以的,您可以按编号删除该条目(例如,通过sed -i.bak 10d〜/ .ssh / known_hosts删除的第十个条目),但这通常不是必需的。可能是因为使用了非标准端口,在这种情况下,您可能必须将命令格式化为(注释引号):ssh-keygen -R'[hostname]:2222'

–迈克尔
16-09-20在9:13

很高兴知道@michael_n,这很可能是非标准端口,影响了我删除条目的能力。我还应注意,如果您已接受一个主机的多个指纹,则不确定它是一次删除还是一次删除所有条目。

–dragon788
16-09-20在15:06

#5 楼

只是分享我刚刚找到的另一个简单易用的答案。对我来说,删除主机名是不可行的,因为known_hosts文件是散列的。但是,我可以根据错误消息中的行号手动编辑出主机条目。如Mike Scott先前所述,错误消息中包含有问题的主机名行号。

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

我得到了cli magic的这一点

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


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

#6 楼

如果要删除某些IP的主机密钥,则将有所帮助:

ssh-keygen -f "~/.ssh/known_hosts" -R "49.12.89.136"

#7 楼

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


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

评论


IP地址和主机名不再逐字(明文)存储在已知主机文件中,因此将无法使用。一个应该使用ssh-keygen -R ...(最好);或者,用特定的行号来删除。另外,要就地安装,请使用-i'选项;例如,sed -i.bak 10d〜/ .ssh / known_hosts`删除第10行,(可选)将原始文件保留在后缀为.bak的备份文件中。

–迈克尔
16-09-20在9:18

#8 楼

您可以通过更新来避免删除特定主机:

ssh-keyscan -t ecdsa hostname >> ~/.ssh/known_hosts


这样,您不必再次连接到主机。