在过去的几周中,我构建了多个虚拟机。问题是,.ssh/known_hosts在中间警告中给了男人。发生这种情况是因为另一个指纹与虚拟机IP相关联。

但是,在.ssh/known_hosts文件中,我找不到与IP相关的记录,只有两个奇怪的,类似于密钥的字符串和“ ssh-rsa“。

是否有人对如何从known_hosts删除旧密钥有任何想法?

评论

您所指的“ bizarre,类似键的字符串”是散列的主机/ ip地址。此安全功能有助于阻止入侵者知道您有权访问哪些系统。如果看到此消息,则您的ssh_config设置了HashKnownHosts yes。

如果您觉得文件内容太混乱,则可能已激活换行。停用它。所有行均以主机名或IP地址开头。

#1 楼

sed -i '6d' ~/.ssh/known_hosts


将修改文件〜/ .ssh / known_hosts:6,删除第6行。

我认为,使用ssh-keygen -R对于openssh高级用户是更好的解决方案,而您的常规Linux管理员最好使用上述方法来保持其sed技能的最新状态。

评论


如果您有官方的配置文件,我认为手动编辑配置文件不是一个好建议。冒险并不能使您成为专业人士,而找到最快,最安全的选择却可以。这就像告诉人们继续进行编辑而无需使用visudo的/ etc / sudoers一样。如果您想提高自己的sed技能,请继续做下去而不会使系统混乱。

– kraxor
14-6-27在11:56



“如果您有正式的申请” => ssh-keygen -R和sed -i {line} d都是相当“官方的”,并且在可预见的将来都可以使用。 Util ssh-keygen允许按行号删除,两者都是完全可以接受的(因为与处理现代数据中心主机名相比,行号通常更易于处理,并且更不易出错)。

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

A)特别是删除第6行,都是非常“看不见的手”。根本没有解释文件第六行的重要意义吗? B)另外人ssh-keygen提到了ssh-keygen -R主机名,而您刚才说的ssh-keygen -R没有指定主机名,并且您还没有解释这个意思。

– barlop
18 Mar 16 '18在5:33



#2 楼

最简单的解决方案是:
rm -f .ssh/known_hosts


ssh将再次重新创建文件,但是会丢失对其他主机的密钥检查!

或者,您可以用途:

ssh-keygen -R "hostname"


或ssh“中间人”消息应指示known_hosts文件的哪一行具有令人讨厌的指纹。编辑文件,跳到该行并将其删除。

评论


ssh-keygen -R主机名也可以使用。

–user1686
09年8月26日在17:14

如果我们删除该文件,其他键也将删除。

–shgnInc
2014年5月4日在9:13

删除文件是一个坏建议,就像告诉某人购买新PC,因为旧PC的鼠标坏了。手动编辑可以由官方应用程序编辑的文件也是一个坏主意。添加ssh-keygen选项是因为有注释,但没有解释。我认为这个答案不应该得到如此多的批评。

– kraxor
14年6月27日在11:52

-1由于整个“删除整个known_hosts文件”的第一行。这是一个可怕的,可怕的,可怕的事情,应该删除。

–奥利维尔·杜拉克(Olivier Dulac)
15年3月9日在10:35

此解决方案是过大的。只需删除违规行。而已。

–布雷克·弗雷德里克(Blake Frederick)
16年5月11日在18:31

#3 楼

为此,有一个ssh-keygen开关(-R)。

man ssh-keygen读取:




-R主机名


hostname文件中删除所有属于known_hosts的密钥。此
选项对于删除散列主机很有用(请参阅上面的-H选项)。


评论


这是最简单,最安全的方法。

–鸡肉
2014年4月15日14:13在

注意:这会将已知主机文件的权限更改为0600。如果由于任何原因拥有共享的已知主机文件,则可能会禁用该文件的共享。

–吉里·克劳达(Jiri Klouda)
17年9月11日在18:04



和正确的一个。另外,我必须使用方括号来执行[localhost]:port,因为我使用了一个自定义端口(我猜是= /)。就像其他人所说的那样,我也将在临时/测试系统开发中使用no SSH密钥检查方法。

–解毒
18-10-26在12:58

这消除了所有的毛发,所以是最好的方法。您可以使用以下命令添加新密钥:ssh-keyscan -H my.ssh.server.example.com >>〜/ .ssh / known_hosts;

– Nux
19-10-16在11:08

添加示例将为这篇文章增添价值

– redbandit
20年6月27日在11:54

#4 楼

您需要运行以下命令来解决此问题。打开终端并输入以下命令:
对于以下所有示例,只需将-R后的值替换为
ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com


评论


先前的答案中已经建议使用此方法。您能否扩展答案的不同之处?

– Burgi
16年5月31日在8:02

@Burgi-这个答案比到目前为止的其他任何答案都提供了更多有关ssh-keygen -R语法的信息。它通过示例确切显示了-R之后可以写的内容。因此,即使这不是一个全新的答案,这个答案也是值得的。

–易兹
17年12月25日在9:03

@Yitz我的评论是评论的一部分。当时(18个月前),我认为这个问题需要一点帮助才能使其变得更好。

– Burgi
17年12月25日在23:01

#5 楼

该警告将告诉您已知主机文件中的确切行。

这里是一个示例:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!


请参阅/home/user/.ssh/known_hosts:6部分?它指定文件和行号。

#6 楼

所有答案都是好的,但是对于真正的SSH专业人士,我们缺少如何使用(非标准)端口号删除ssh签名的信息。



简单的SSH主机签名remove命令:

ssh-keygen -R example.com



删除复杂的ssh密钥,例如您在非标准端口222上连接到ssh:

ssh example.com -p 222



并得到警告,要删除此警告,您需要使用方括号冒号端口号:

    ssh-keygen -R [example.com]:222


希望对非标准配置用户有所帮助。

评论


正是我一直在寻找的东西。谢谢!

– aexl
19-10-3在12:42

#7 楼

您还可以使用UserKnownHostsFile和StrictHostKeyChecking标志指示ssh不要检查known_hosts文件。

例如:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com


为了易于使用您可以使用以下别名:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'


现在,只要您确定信任服务器的证书,就可以使用粗体字。

评论


多么可怕的主意。只是因为您懒于保持〜/ .ssh / known_hosts为最新状态,才能永久禁用安全层?为什么不继续使用telnet? “只要您有把握”-如果您有把握,那么您就不知道什么是MITM攻击,您可能应该花一些时间阅读一些好的文献。

– kraxor
14年6月27日在12:02

基于OP的问题,我认为这是一个有效的答案。有时您有一个要在其上创建/销毁大量VM的测试系统。 (在准备RHCE考试时,我现在正在这样做。)可能没有任何安全隐患。尽管注意到安全隐患是巨大的,但我认为这不必被标记为“可怕的想法”。

–里克·查塔姆
2015年10月1日在19:54

相关:superuser.com/a/1126243/73961

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

#8 楼

这是使用Ex编辑器的方法:

ex +6d -scwq ~/.ssh/known_hosts


其中6th是警告消息中提到的行号。例如:


/home/user/.ssh/known_hosts中IP的违规密钥:6 <==线号



通常,建议使用ex来非交互式地编辑文件,而不要使用sed来编辑文件,-i最好是Stream EDitor及其q4312079q参数,这是非标准的FreeBSD扩展名。

#9 楼

主机名或ip的条目应在第一列中。该警告还应列出有问题的密钥所在的行号。

#10 楼

您还可以使用以下方法从已知主机中删除一行: rmknownhost 111(111是要删除的行):

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}


将其另存为rmknownhost在您的PATH的文件夹中。

评论


与在任何给定的文本编辑器中执行此操作相比,这样做有什么好处?是否有某些理由不这样做,例如必须如何使用visudo编辑sudoers?

–安迪·莱斯特(Andy Lester)
10年6月22日在16:37

这有什么发行版? Ubuntu似乎没有它。

– flickerfly
13年7月19日在13:54

好处是它是自动化且快速的/它是您自己添加的单独二进制文件

–杂货店
13年7月20日在15:17

您可能只是在这里发布了脚本,而不是链接您在发布此答案当天创建的博客条目。这符合垃圾邮件恕我直言。更不用说您可以创建一个简单的别名来实现相同的结果,而无需7行长的ruby脚本。

– kraxor
14年6月27日在12:08

或只是将其添加到您的〜/ .bashrc中:sshdel(){sed -i“ $ {@} d”〜/ .ssh / known_hosts; },并使用sshdel [行号]进行调用。没有红宝石,没有二进制,没有后顾之忧。

–胭脂
19-09-24在17:19



#11 楼

它是一个文本文件。您可以使用vi(m)轻松进行编辑,只需删除相关行(dd),然后保存文件(wq)。但是,如果有删除主机的特定命令,那可能是最安全的方法。

评论


我看不到直接在VIM中编辑文件是“不安全的”。它基于您对VIM的舒适度。尤其是使用此文件时,最大的风险是删除过多的密钥,在这种情况下,只会再次提示您。

–里克·查塔姆
2015年10月1日在19:56

我所指的“安全性”涉及1)忘记/不知道要删除其他文件(如果有)中的相关信息,以及2)偶然删除多于或少于需要的内容,从而破坏了文件。

– Ryan Griggs
2015年10月2日,18:41