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


309

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

Answers:


514

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

ssh-keygen -R hostname

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

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

4
另外,它会自动保留备份(在我的osx机器上:Original contents retained as /Users/nha/.ssh/known_hosts.old,与Ubuntu相同)。
nha 2015年

17
另外,如果您使用的是非标准ssh端口,请使用此格式ssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J 2015年

这个问题的最佳答案。就像魅力一样工作
bademba,2017年

32

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


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

19

我最近才开始使用主机密钥,但是当我弄乱了主机密钥时,通常每行只有一个密钥,因此备份文件并一次删除一个,直到找到正确的密钥为止。然后再添加其他人。做到这一点还有很长的路要走,但应该可以。

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

vim ~/.ssh/known_hosts

并击中

dd

然后保存。


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

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

3

使用ssh-keygen -R主机名并不总是有效。如果您具有“隐藏”主机名的较新版本的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

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

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

1

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

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

我有点cli魔术了

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

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


0
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 ...(最好);或者,sed使用要删除的特定行号。另外,sed就地使用-i' option; e.g., sed -i.bak 10d〜/ .ssh / known_hosts`删除第10行,并将(原始)保存在后缀为的备份文件中.bak
迈克尔

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.