试图ssh到我控制的电脑,我得到熟悉的消息:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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 RSA key sent by the remote host is [...]. Please contact your system administrator. Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message. Offending RSA key in /home/sward/.ssh/known_hosts:86 RSA host key for [...] has changed and you have requested strict checking. Host key verification failed.
我确实改变了关键。 我读了几十个post,说解决这个问题的方法是从known_hosts
文件中删除旧密钥。
但是我想要的是让ssh接受旧密钥和新密钥。 错误消息中的语言(“ Add correct host key
”)表明应该有一些方法来添加正确的主机密钥而不删除旧的主机密钥。
我一直没能弄清楚如何添加新的主机密钥而不删除旧的。
这是可能的,还是错误信息只是非常误导?
获取服务器的rsa密钥:
$ ssh-keyscan -t rsa server_ip # server_ip SSH-2.0-OpenSSH_4.3 server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
并在客户端上,将此密钥添加到~/.ssh/known_hosts
:
server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key) server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
删除来自known_hosts的条目,使用:
ssh-keygen -R *ip_address_or_hostname*
这将从known_hosts文件中删除有问题的IP或主机名,并尝试重新连接。
从手册页:
-R hostname
从known_hosts文件中删除属于主机名的所有密钥。 此选项对于删除散列主机非常有用(请参阅上面的-H选项)。
一个非常简单的方法是:
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak
然后编辑known_hosts来清除原始密钥,然后使用以下命令ssh到主机:
ssh name@computer
它会自动添加新的密钥; 然后比较这两个文件。 像meld这样的程序是比较这两个文件的好方法。 然后合并文件以使known_hosts包含两个键
我保留两个密钥的“理由”是目标系统是多重启动的,即使我敢说在安装过程中有一种同步密钥的方法,但允许多个密钥似乎更直接。
编辑 2015/06
我应该补充一下,现在重新审视它,我注意到一个更简单的方法[只要条目是可识别的,通常从主机名/ IP地址除了引用其特定位置的错误消息外]。
甚至有HostKeyAlias选项
ssh -o HostKeyAlias=mynewaliasforthemachine name@computer
那么随后,在ssh客户机在别名下面添加新密钥之后,可以编辑known_hosts来replace别名的“真实”主机名/ IP地址,或者使用别名选项连接到该主机的那个化身
我有一个覆盆子pi的问题,我用几个不同的系统(用于编译arm二进制文件,项目,xbmc等的开发系统)启动,并遇到同样的问题。 他们在本地networking上使用DHCP,因为MAC地址相同,所以我的路由器总是重复使用相同的IP。 我已经通过在我的主机文件中使用不同的域名解决了这个问题:
10.10.10.110 pi-dev 10.10.10.110 pi-xbmc 10.10.10.110 pi-etc
known_hosts文件通过主机名保存指纹,即使它是相同的IP地址,每个唯一的主机名也会得到不同的条目。
每当我使用一个新的系统时,我厌倦了为主机文件添加名称,所以我想出了一个更加懒惰的方式,通过在ip地址上使用前导零:
$ ssh [email protected] $ ssh [email protected] $ ssh [email protected]
(uncanonicalized)ip地址的每一个变化得到它自己在known_hosts条目。
我不明白你为什么要用两个键来工作,但是你可以给~/.ssh/known_hosts
文件添加多个有效的键,但是你必须手动完成。
另一种解决scheme可能是对这个特定主机使用StrictHostKeyChecking=no
选项:
ssh -o StrictHostKeyChecking=no user@host
你可以把它放在你的~/.profile
或类似的别名中。
alias hc=ssh -o StrictHostKeyChecking=no user@host
如果您的客户端和服务器都具有OpenSSH 6.8或更高版本,则可以在ssh_config
或~/.ssh/config
使用UpdateHostKeys yes
选项。 例如:
Host * UpdateHostKeys yes
这使得SSH将所有主机密钥存储到服务器的所有主机密钥中,当服务器更改或删除一个主机密钥时,密钥也会在known_hosts
更改或删除。
如果你只 ssh到本地networking然后…
一个简单的解决scheme是擦拭旧的密钥文件,并将其replace为空白的文件。 这将允许您使用新密钥重新授权所有连接。 如果您的本地networking之外的站点存储了ssh密钥,则需要确保初次连接是安全的,就像您第一次连接到该服务器时一样。
例如
cp known_hosts known_hosts.old rm known_hosts nano known_hosts
然后按空格,退格cntl + x和'y'保存新的缓冲区(文件)。 它不好的做法,但可以提供你不经常ssh'ing以外的本地networking(例如单一或工作服务器)
在安全的本地networking上,这是安全的,因为你只是不能让一个人在中间的攻击。
它总是更好地使用你明白的代码!
这么多的答案,但太多,放弃保护,closures严格的主机检查,或摧毁无关的主机信息,或只是强迫用户交互接受密钥,可能在稍后的时候,当意外。
这里有一个简单的技巧,可以让你离开严格的主机检查,但是当你期望它改变的时候,以一种受控的方式更新这个键:
删除旧密钥并在一个命令中更新
ssh-keygen -R server.example.com && \ ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
重复使用IP地址或其他主机名称。
这种方法的优点是它重新键入服务器一次。 如果您尝试删除的服务器不存在于已知主机文件中,那么大多数ssh-keygen版本似乎都不会返回错误,如果这对您是个问题,请按顺序使用这两个命令。
这种方法还validation连接性,并发出一个很好的消息,以logging在SSH命令(login,更新主机密钥,并输出SSH主机密钥更新,然后立即退出。
如果你的ssh-keygen版本返回一个非零的退出代码,并且你更愿意处理这个没有错误,无论是否连接,只要简单地使用这两个命令,忽略ssh-keygen命令上的任何错误。
如果你使用这种技术,你永远不需要改变你的ssh命令,或者closures主机检查,除了那一个ssh命令。 只要上面的ssh命令没有错误地运行,你可以确定将来的ssh会话不会发生冲突,也不需要明确地接受一个新的密钥。
使用: ssh-keygen -R "hostname|ip address"
它将删除主机条目并将known_hosts的备份logging为known_hosts.old
我有同样的问题。
我所做的只是sudo nano /home/user/.ssh/ host_allow
并删除了密钥。
当我ssh回到服务器,它添加了一个新的密钥。
使用sed命令删除有问题的行
OUTPUT: as show in above example Offending key in /home/user/.ssh/known_hosts:86
删除已知主机中提到的第86行。
CODE: sed -i '86d' /home/user/.ssh/known_hosts
下次使用ssh访问时,系统会自动添加新的密钥。
使用:
ssh-keygen -R <hostname|ip address>
它将删除主机名条目并将.known_host
备份.known_host
为known_hosts.old
如果你是一个mac用户,你可以使用sudo ssh user@server
input你的密码..一切都好! 我只是试了一下,解决了我的问题