我想/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。