如何在没有 ssh-keyscan 的情况下将密钥添加到全局 ssh_known_hosts?

如何在没有 ssh-keyscan 的情况下将密钥添加到全局 ssh_known_hosts?

我想/etc/ssh/ssh_known_hosts在不运行的情况下向文件添加条目ssh-keyscan。我尝试添加公钥,但 ssh 抱怨指纹不匹配。

来自 sshd 手册页:

SSH_KNOWN_HOSTS 文件格式

 The /etc/ssh/ssh_known_hosts and ~/.ssh/known_hosts files contain host
 public keys for all known hosts.  The global file should be prepared by
 the administrator (optional), and the per-user file is maintained auto-
 matically: whenever the user connects to an unknown host, its key is
 added to the per-user file.

因此,我的看法是,可以添加公钥数据。但是,这对我来说似乎不起作用。

我的ssh_known_hosts看起来像这样:(与我的公钥文件的内容相匹配的关键部分)

192.168.1.208 ssh-rsa AAAAB3Nza......zktpC1w==

运行 ssh-keyscan 得到以下结果:

192.168.1.208 ecdsa-sha2-nistp256 AAAAE2V...2L0=
192.168.1.208 ssh-rsa AAAAB3Nza...38Ll
192.168.1.208 ssh-ed25519 AAAAC3Nza...m2Sc

所以我可以看到,ssh-rsa 显示的密钥与我的公钥文件中的内容结尾不同。

我怎样才能在没有的情况下将正确的数据添加到ssh_known_hosts文件ssh-keyscan

(我的环境:我在 cygwin 环境中使用 puttygen 创建密钥、ssh-keygen 等,以便根据需要进行转换。最终,这些密钥在 Alpine linux VM 中用于 VM 之间的 ssh/scp。)

答案1

好吧,您可以使用 Ansible 的 shell 模块等来收集与主机密钥相对应的公钥(顺便说一下,这也应该是幂等的):

for i in /etc/ssh/*.pub
do
    printf "$(hostname) "
    awk '{print $1, $2}' ${i}
done

这将输出类似以下内容的内容:

<host> ecdsa-sha2-nistp256 AAAAE....vstxo4xdk3rms=
<host> ssh-ed25519 AAAAC....Wg3XxwzL
<host> ssh-rsa AAAAB3Nza....83u3X

我所依赖的事实是,公钥通常有 3 个空格分隔的字段,其中第三个是您不需要的注释。通常情况下,root@<hostname>您也可以执行以下操作:

for i in /etc/ssh/*.pub
do
    awk '{print gensub(".*@", "", 1, $3), $1, $2}' ${i}
done

这样,您就应该能够整理您的 ssh_known_hosts。使用 Ansible 或类似工具,您甚至可以收集相应主机上的 IP 和 FQDN,并使用 IP(用于您想要连接但 DNS 不起作用的情况或只是为了完整性)或替代(DNS)名称扩展 ssh_known_hosts。

相关内容