当我ssh到一台机器时,有时我会收到此错误警告,并提示说“是”或“否”。从自动ssh到其他计算机的脚本运行时,这会导致一些问题。
警告信息:
The authenticity of host '<host>' can't be established.
ECDSA key fingerprint is SHA256:TER0dEslggzS/BROmiE/s70WqcYy6bk52fs+MLTIptM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'pc' (ECDSA) to the list of known hosts.
有没有办法自动说“是”或忽略这个?
根据您的ssh客户端,您可以在命令行上将StrictHostKeyChecking选项设置为no,和/或将密钥发送到null known_hosts文件。您还可以在配置文件中为所有主机或给定的IP地址或主机名设置这些选项。
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
编辑
正如@IanDunn所指出的,这样做存在安全隐患。如果您连接的资源已被攻击者欺骗,他们可能会将目标服务器的挑战重播给您,这让您误以为您正在连接到远程资源,而实际上他们正在连接到该资源你的凭据。在更改连接机制以跳过HostKeyChecking之前,您应该仔细考虑是否存在适当的风险。
通常,当您经常修改密钥时会出现此问题。基于服务器,可能需要一些时间来更新您在服务器中生成并粘贴的新密钥。因此,在生成密钥并粘贴到服务器后,等待3到4个小时然后尝试。问题应该解决。它发生在我身上。
理想情况下,您应该创建一个自我管理的证书颁发机构。从生成密钥对开始:
ssh-keygen -f cert_signer
然后签署每个服务器的公共主机密钥:
ssh-keygen -s cert_signer -I cert_signer -h -n www.example.com -V +52w /etc/ssh/ssh_host_rsa_key.pub
这将生成一个签名的公共主机密钥:
/etc/ssh/ssh_host_rsa_key-cert.pub
在/etc/ssh/sshd_config
中,将HostCertificate
指向此文件:
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
重启sshd服务:
service sshd restart
然后在SSH客户端上,将以下内容添加到~/.ssh/known_hosts
:
@cert-authority *.example.com ssh-rsa AAAAB3Nz...cYwy+1Y2u/
以上包含:
@cert-authority
*.example.com
cert_signer.pub
的全部内容cert_signer
公钥将信任其公共主机密钥由cert_signer
私钥签名的任何服务器。
虽然这需要在客户端进行一次性配置,但您可以信任多个服务器,包括那些尚未配置的服务器(只要您签署每个服务器即可)。
有关更多详细信息,请参阅this wiki page。
将这些添加到/ etc / ssh / ssh_config
Host *
UserKnownHostsFile=/dev/null
StrictHostKeyChecking=no
在主机服务器上运行它是预感问题
chmod -R 700 ~/.ssh
我解决了下面写错误的问题: 错误: 无法建立主机“XXX.XXX.XXX”的真实性。 RSA密钥指纹是09:6c:ef:cd:55:c4:4f:ss:5a:88:46:0a:a9:27:83:89。
解: 1.安装任何openSSH工具。 2.运行命令ssh 3.它会要求你添加这个主机。接受是的。 4.此主机将添加已知主机列表。 5.现在您可以与此主机连接。
这个解决方案现在正在......
值得更好回答的老问题。
您可以在不禁用StrictHostKeyChecking
(这是不安全的)的情况下阻止交互式提示。
将以下逻辑合并到您的脚本中:
if [ -z `ssh-keygen -F $IP` ]; then
ssh-keyscan -H $IP >> ~/.ssh/known_hosts
fi
它检查服务器的公钥是否在known_hosts
中。如果没有,它从服务器请求公钥并将其添加到known_hosts
。
通过这种方式,您只会遭受一次中间人攻击,这可以通过以下方式减轻:
要禁用(或控制禁用),请将以下行添加到/etc/ssh/ssh_config
的开头...
Host 192.168.0.*
StrictHostKeyChecking=no
UserKnownHostsFile=/dev/null
选项:
*
,以允许不受限制地访问所有IP。/etc/ssh/ssh_config
或用于特定于用户的配置的~/.ssh/config
。见http://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html
类似的问题在superuser.com上 - 请参阅https://superuser.com/a/628801/55163
确保~/.ssh/known_hosts
是可写的。这为我解决了这个问题。
除此之外,最好的方法是使用'BatchMode'和'StrictHostKeyChecking'。这样,您的脚本将接受新的主机名并将其写入known_hosts文件,但不需要是/否干预。
ssh -o BatchMode=yes -o StrictHostKeyChecking=no [email protected] "uptime"
编辑通常位于'〜/ .ssh / config'的配置文件,并在文件的开头添加以下行
Host *
User your_login_user
StrictHostKeyChecking no
IdentityFile ~/my_path/id_rsa.pub
用户设置为your_login_user
表示此设置属于your_login_user
StrictHostKeyChecking设置为no将避免提示
IdentityFile是RSA密钥的路径
这适用于我和我的脚本,祝你好运。
由于安全功能而发出此警告,请勿禁用此功能。
它只显示一次。
如果它仍然出现在第二次连接后,问题可能是写入known_hosts
文件。在这种情况下,您还将收到以下消息:
Failed to add the host to the list of known hosts
您可以通过更改用户可以写入的文件权限更改的所有者来修复它。
sudo chown -v $USER ~/.ssh/known_hosts
参考Cori的答案,我修改了它并使用了下面的命令,这是有效的。没有exit
,剩下的命令实际上是记录到远程机器,我不想在脚本中
ssh -o StrictHostKeyChecking=no user@ip_of_remote_machine "exit"
这样做 - > chmod +w ~/.ssh/known_hosts
。这会在~/.ssh/known_hosts
中为文件添加写入权限。之后,当您下次连接到远程主机时,它将被添加到known_hosts
文件中。