我可以通过SSH连接到局域网中的另一台Ubuntu计算机。在两台PC上,我都安装了openssh-server
,但是从另一台Ubuntu计算机上,我无法通过SSH连接到PC,但出现此错误:


主机密钥验证失败...


评论

您使用主机名还是IP地址?

不相似,但由于出现不同的问题,我遇到了相同的错误:serverfault.com/questions/494916/…

这不是Ubuntu特有的问题。可以通过命令行中的任何ssh发生。

#1 楼

“主机密钥验证失败”表示远程主机的主机密钥已更改。

SSH将远程主机的主机密钥存储在~/.ssh/known_hosts中。您可以手动编辑文本文件并删除旧键(您可以在错误消息中看到行号),也可以使用

ssh-keygen -R hostname


从手册页:


-R主机名从known_hosts文件中删除所有属于主机名的键。此选项对删除散列的主机很有用。


(我从答案中了解到
是否可以从SSH的known_hosts文件中删除特定的主机密钥?)。 br />

评论


这也可能意味着您根本没有远程主机的主机密钥。例如,如果我rm〜/ .ssh / *,则ssh -o BatchMode = yes root @ somewhere,如果没有其他错误,我将获得主机密钥验证失败。如果您始终处于交互状态,则不重要,但与遇到相同错误的脚本相关。

–罗恩·伯克(Ron Burk)
17年4月25日在23:19

毫不奇怪,ssh-keygen -R example.net:7999会生成在known_hosts中找不到的host example.net:7999。

– alex
18年2月12日在18:35

我删除了known_hosts文件,然后再次使用了ssh。有效。

–巴黎
18年6月6日在10:49

〜/ .ssh / known_hosts文件不可读

–JoãoPimentel Ferreira
19年8月5日在17:03



奇迹般有效。主机名也可以是IP地址。谢谢!

– Pieter
20 May 10 '14:26

#2 楼

如果您在某些远程/脚本化情况下运行,而您对交互式提示添加主机键缺乏交互访问权限,请按以下方法解决:

$ ssh -o StrictHostKeyChecking=no user@something.example.com uptime


警告:将“ something.example.com,10.11.12.13”(RSA)永久添加到已知主机列表。

评论


+1,这是一个丑陋的解决方案,但是在某些与动态IP连接设备配合使用的自动监视过程中,这是一个简单且可以接受的解决方案。

– Ninsuo
13年11月11日14:34

+1例如,对于Jenkins处决,这是一个很好的解决方案。谢谢

–路宝
2015年2月5日在10:02

@Lobo完全不同意,我将它用于jenkins,这很酷sh“”“ ssh -o StrictHostKeyChecking =否ec2-user @ someIpAddress-e2e sudo服务tomcat重新启动”“”

– prayagupd
17年6月8日在21:40

救了我。救生员解决方案。

–user1735921
17-10-12在6:43

救了我。我遇到了作为系统服务运行的脚本的麻烦。当我查看日志时,我的脚本总是打印此错误。当我使用此选项在脚本内启动ssh时,再也不会出现此错误。

– Mubin Icyer
20年9月1日于13:35

#3 楼

另外有时在串行控制台上工作时会出现这种情况,然后在详细模式下检查以上命令-v会显示/dev/tty不存在,而实际上却不存在。在上述情况下,只需删除/dev/tty并创建/dev/ttyS0/dev/tty的符号链接。

ssh -v user@hostname


作为替代方案,将id_rsa.pub添加到远程位置,这样就不会提示输入密码,并且您获得登录权限。

评论


+1建议使用-v参数;在调试ssh问题时,这可以有很大帮助。

–丹尼尔·库尔曼
2012年7月24日19:10

#4 楼

以我为例,这是由udev问题引起的-没有/dev/tty设备节点。对我来说,解决方案是:

sudo mknod -m 666 /dev/tty c 5 0


#5 楼

在终端上:

ssh -o StrictHostKeyChecking=no -i YourPublicKey.pem user@example.com uptime


将出现以下消息或类似消息:

Warning: Permanently added 'example.com, XX.XXX.XXX.XX' (ECDSA) to the list of known hosts.
 00:47:37 up 3 min,  0 users,  load average: 0.00, 0.00, 0.00


然后连接您的EC2正常运行:

ssh -i YourPublickey.pem user@example.com


评论


我收到了命令行第0行:是/否/询问参数错误。因为您错误地将“ No”而不是“ no”用作StrictHostKeyChecking的参数

– Axel Bregnsbo
18年8月25日在15:30

#6 楼

当ssh确认您要继续连接时,可能只需要输入“是”即可。

像下面这样。

 The authenticity of host 'xxx' can't be established.
ECDSA key fingerprint is yyy.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'xxx' (ECDSA) to the list of known hosts.
Enter passphrase for key '/Users/ysy/.ssh/id_rsa':
 


,然后输入密码。

请注意“确定要继续连接(是/否)吗?是”。您必须输入是,而不是输入。

评论


哇。我不敢相信这行得通。大声笑。我一直按Enter键。输入yes的指令应该更明确

– Emmanuel N K
20年6月18日在8:52

#7 楼

好吧,这仅仅是因为第二个ubuntu需要通过密钥而不是密码进行连接。

我建议您在PC上使用sudo dpkg-reconfigure openssh-server,然后它应该可以正常工作。它将重置openssh的配置,并应返回到默认的密码身份验证。第二种可能性是您的PC中已经存在另一个ubuntu的密钥,并且它已更改,因此不再被识别。在这种情况下,您必须编辑文件.ssh/authorized_keys,以删除有问题的行来标识您的Ubuntu。

#8 楼

这是一个旧线程,我遇到了这个答案,我将添加为解决此问题所做的工作。

ssh-keygen -f "/home/USER/.ssh/known_hosts" -R HOSTNAME


我只是看着它的错误消息扔给我,它说要运行该命令以便将其从主机列表中删除。之后,我执行以下操作:

ssh-copy-id HOSTNAME


然后我按照提示从那里进行操作,直到可以SSH进入服务器。

评论


作为此命令,我在ubuntu 12.4中得到了建议。

–MaNKuR
15年5月31日在18:09

#9 楼

您应该以这种方式更改密钥:
从给定的错误中查找为
更改的主机密钥示例:在/Users/user-name/.ssh/known_hosts:5
更改了第5个密钥,请执行以下操作:

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


注意:您必须是root用户或具有sudo特权。

评论


不,除非您正在为其他人这样做,否则它不需要root或sudo。您正在编辑主目录中的文件。第二:要使该命令起作用,需要GNU sed。

– techraf
16年3月13日在16:00

也许是正确的,但是我尝试从Mac OSX切换到ubuntu-server,我必须这样做。顺便说一句,谢谢您的评论。

– Amir.A.G
16-3-14在16:44



#10 楼

这意味着您的远程主机密钥已更改(可能是主机密码更改),

您的终端建议以root用户身份执行此命令

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]:4231


您必须从PC /服务器上的主机列表中删除该主机名。复制建议的命令并以root用户身份执行。

$ sudo su                                                            // Login as a root user

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]:4231   // Terminal suggested command execute here
Host [www.website.net]:4231 found: line 16 type ECDSA
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

$ exit                                                               // Exist from root user

$ sudo ssh root@www.website.net -p 4231                              // Try again


希望这项工作有效。

#11 楼

您必须通过在目标上运行目标主机来将目标主机的rsa密钥放入源主机/home/user/.ssh/known_hosts

ssh-keyscan -t rsa @targethost


#12 楼

除了严格禁用主机密钥检查以外,还可以通过键入以下内容进行连接:

ssh -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no <username@target_machine_ip_or_domain_name>


#13 楼

只需执行“ sudo vi /var/root/.ssh/known_hosts”并删除该行即可,该行为您要连接的主机提供了密钥,然后再次重新连接。

我不知道您的特定情况,但是最有可能出现此错误,并显示以下消息:

my_mac:~ oivanche$ sudo ssh pi@192.168.0.45
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:sx1Z4xyGY9venBP6dIHAoBj0VhDOo7TUVCE2xWXpzQk.
Please contact your system administrator.
Add correct host key in /var/root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /var/root/.ssh/known_hosts:74
ECDSA host key for 192.168.0.45 has changed and you have requested strict checking.
Host key verification failed.


如果您仔细阅读日志,将会看到您从主机获得的密钥与您已经拥有的密钥发生冲突-在这种情况下,它位于known_hosts文件的第74行(/var/root/.ssh/known_hosts:74中违反ECDSA密钥)。
从已知主机中删除线路,保存更改并重新连接。

评论


这帮助了我-谢谢

– Karan Desai
19/12/3在14:19

#14 楼

pico ~/.ssh/known_hosts并删除所有行,只需重新连接后,您将获得一个新密钥。

评论


这是一个危险的解决方案,因为您将删除所有主机密钥。可接受的解决方案ssh-keygen -R主机名更好。

–麦桑福德
2014年3月24日20:52

#15 楼

我的解决方案来自此博客文章:SSH安全Shell客户端的算法协商失败

您需要按如下所示修改文件:

sudo nano /etc/ssh/sshd_config


然后添加以下内容:

# Ciphers
Ciphers aes128-cbc,aes192-cbc,aes256-cbc,blowfish-cbc,arcfour
KexAlgorithms diffie-hellman-group1-sha1


基本上,您尝试了不同的解决方案,直到找到可以解决问题的解决方案。如果上述解决方案不起作用,请尝试此解决方案。如果此方法无法正常运行,请尝试其他方法。

#16 楼

如果将-v选项添加到ssh(可能不止一次),它将打印各种内容,这可能有助于识别问题。就我而言,它抱怨/dev/tty权限,而chmod 666 /dev/tty解决了该问题。

#17 楼

chmod 666 /dev/tty 


是另一种tty解决方案-有时,该设备文件具有错误的权限。