这是我的情况:我正在设置一个测试工具,它将从中央客户端启动许多虚拟机实例,然后通过ssh
. 虚拟机将具有以前未使用的主机名和 IP 地址,因此它们不会出现在~/.ssh/known_hosts
中央客户端的文件中。
我遇到的问题是ssh
针对新虚拟实例运行的第一个命令总是会出现交互式提示:
The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?
有没有一种方法可以绕过这个并让客户端机器已经知道新主机,也许是通过使用已经烘焙到虚拟机映像中的公钥?如果可以的话,我真的很想避免使用 Expect 或其他任何东西来回答交互式提示。
IMO,最好的方法是:
这将确保没有重复的条目,主机名和 IP 地址都覆盖了您,并且还将散列输出,这是一种额外的安全措施。
在配置文件中或通过以下方式将
StrictHostKeyChecking
选项设置为:no
-o
ssh -o StrictHostKeyChecking=no [email protected]
对于懒惰的人:
-H 散列主机名/IP地址
如前所述,使用按键扫描将是正确且不显眼的方式。
仅当尚未添加主机时,以上内容才能添加主机。它也不是并发安全的;您不能同时在同一台源计算机上多次执行该代码段,因为 tmp_hosts 文件可能会被破坏,最终导致 known_hosts 文件变得臃肿......
您可以使用
ssh-keyscan
命令来获取公钥并将其附加到您的known_hosts
文件中。这是您可以将ssh-keyscan合并到您的游戏中的方法:
这将是一个完整的解决方案,仅第一次接受主机密钥
要正确执行此操作,您真正想要做的是在创建 VM 时收集它们的主机公钥并将它们放入
known_hosts
格式文件中。然后,您可以使用-o GlobalKnownHostsFile=...
, 指向该文件,以确保您正在连接到您认为应该连接到的主机。但是,您如何执行此操作取决于您如何设置虚拟机,但是如果可能的话,从虚拟文件系统中读取它,或者甚至/etc/ssh/ssh_host_rsa_key.pub
在配置期间让主机打印内容可能会奏效。也就是说,这可能不值得,这取决于您工作的环境类型以及您预期的对手是谁。如上面其他几个答案中所述,执行简单的“首次连接时存储”(通过扫描或仅在第一次“真实”连接期间)可能会容易得多,并且仍然提供一些安全性。但是,如果您这样做,我强烈建议您将用户已知的主机文件 (
-o UserKnownHostsFile=...
) 更改为特定于该特定测试安装的文件;这将避免使用测试信息污染您的个人已知主机文件,并在您删除 VM 时轻松清理现在无用的公钥。我做了一个单行脚本,有点长但对于为具有多个 IP 的主机执行此任务很有用,使用
dig
和bash
以下避免了 ~/.ssh/known_hosts 中的重复条目: