177

当我 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.

有没有办法自动说“是”或忽略这个?

4

19 回答 19

150

根据您的 ssh 客户端,您可以在命令行上将 StrictHostKeyChecking 选项设置为 no,和/或将密钥发送到 null known_hosts 文件。您还可以在配置文件中为所有主机或给定的一组 IP 地址或主机名设置这些选项。

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

编辑

正如@IanDunn 所说,这样做存在安全风险。如果您要连接的资源已被攻击者欺骗,他们可能会将目标服务器的挑战重播给您,让您误以为您正在连接到远程资源,而实际上他们正在连接到该资源您的凭据。在更改连接机制以跳过 HostKeyChecking 之前,您应该仔细考虑这是否是一个适当的风险。

参考

于 2010-09-08T01:26:14.313 回答
87

老问题值得更好的回答。

您可以在不禁用的情况下阻止交互式提示StrictHostKeyChecking(这是不安全的)。

将以下逻辑合并到您的脚本中:

if [ -z "$(ssh-keygen -F $IP)" ]; then
  ssh-keyscan -H $IP >> ~/.ssh/known_hosts
fi

它检查服务器的公钥是否在known_hosts. 如果没有,它会从服务器请求公钥并将其添加到known_hosts.

通过这种方式,您只会遭受一次中间人攻击,可以通过以下方式缓解:

  • 确保脚本首次通过安全通道连接
  • 检查日志或 known_hosts 以手动检查指纹(仅执行一次)
于 2014-07-29T16:44:01.433 回答
41

/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

于 2013-08-22T21:12:49.600 回答
22

确保~/.ssh/known_hosts是可写的。那为我修好了。

于 2014-02-18T12:36:54.150 回答
17

解决此问题的最佳方法是在“StrictHostKeyChecking”之外使用“BatchMode”。这样,您的脚本将接受新主机名并将其写入 known_hosts 文件,但不需要是/否干预。

ssh -o BatchMode=yes -o StrictHostKeyChecking=no user@server.example.com "uptime"
于 2014-06-18T19:10:17.223 回答
10

编辑通常位于“~/.ssh/config”的配置文件,并在文件开头添加以下行

Host *
    User                   your_login_user
    StrictHostKeyChecking  no
    IdentityFile          ~/my_path/id_rsa.pub

用户设置为your_login_user表示此设置属于 your_login_user
StrictHostKeyChecking 设置为 no 将避免提示
IdentityFile is path to RSA key

这适用于我和我的脚本,祝你好运。

于 2014-11-17T17:23:57.610 回答
8

此警告是由于安全功能而发出的,请勿禁用此功能。

它只显示一次。

如果在第二次连接后仍然出现,则问题可能在于写入known_hosts文件。在这种情况下,您还会收到以下消息:

Failed to add the host to the list of known hosts 

您可以通过更改所有者将文件的权限更改为用户可写来修复它。

sudo chown -v $USER ~/.ssh/known_hosts
于 2015-05-27T07:17:13.163 回答
7

理想情况下,您应该创建一个自我管理的证书颁发机构。从生成密钥对开始: 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

尽管这需要在客户端进行一次性配置,但您可以信任多个服务器,包括尚未配置的服务器(只要您签署每个服务器即可)。

有关更多详细信息,请参阅此 wiki 页面

于 2018-02-10T02:17:21.403 回答
5

这样做 -> chmod +w ~/.ssh/known_hosts。这会在~/.ssh/known_hosts. known_hosts之后,当您下次连接时,远程主机将被添加到文件中。

于 2016-01-27T18:15:20.470 回答
5

参考 Cori 的回答,我对其进行了修改并使用了以下命令,该命令有效。没有exit,剩余的命令实际上是登录到远程机器,这是我在脚本中不想要的

ssh -o StrictHostKeyChecking=no user@ip_of_remote_machine "exit"
于 2016-08-02T11:34:04.367 回答
2

通常,当您经常修改密钥时会出现此问题。根据服务器,更新您在服务器中生成并粘贴的新密钥可能需要一些时间。所以在生成密钥并粘贴到服务器后,等待 3 到 4 小时再尝试。问题应该得到解决。它发生在我身上。

于 2013-02-05T10:18:27.060 回答
2

将这些添加到您的 /etc/ssh/ssh_config

Host *
UserKnownHostsFile=/dev/null
StrictHostKeyChecking=no
于 2019-04-28T10:10:12.820 回答
0

在主机服务器中运行它是预兆问题

chmod -R 700 ~/.ssh
于 2018-12-18T07:58:26.280 回答
0

我有同样的错误,并想提请注意这一事实 - 正如它刚刚发生在我身上一样 - 你可能只是拥有错误的特权。
您已将.ssh目录设置为普通用户或root用户,因此您需要成为正确的用户。出现此错误时,我是root但我配置.ssh为普通用户。退出root修复它。

于 2019-09-23T08:14:28.830 回答
0

以下步骤用于向主机验证您自己

  1. 生成 ssh 密钥。系统将要求您为密钥创建密码
ssh-keygen -f ~/.ssh/id_ecdsa -t ecdsa -b 521

(以上使用推荐的加密技术)

  1. 将密钥复制到远程主机
ssh-copy-id -i ~/.ssh/id_ecdsa user@host

注意用户@主机将与您不同。您需要输入此服务器的密码,而不是密钥密码。

  1. 您现在可以安全地登录服务器而不会收到错误消息。
ssh user@host

所有源信息都位于此处: ssh-keygen

于 2020-11-22T17:33:13.473 回答
0

这是试图建立无密码身份验证。因此,如果您尝试手动运行该命令一次,它将要求在那里提供密码。输入密码后,它将永久保存该密码,并且不再要求输入“是”或“否”。

于 2021-07-02T06:10:14.873 回答
0

对我来说,原因是~/.ssh/known_hosts.

我对known_hosts文件没有写权限。所以它一次又一次地问我。

于 2021-12-04T02:32:18.170 回答
-1

在我的情况下,主持人是未知的,而不是输入我刚刚点击yes的问题。are you sure you want to continue connecting(yes/no/[fingerprint])?enter

于 2020-12-12T00:13:42.500 回答
-3

我解决了给出以下书面错误的问题:
错误:
无法确定主机'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. 现在你可以连接这个主机了。

这个解决方案现在正在工作......

于 2013-09-12T11:40:19.757 回答