我有一个动态 IP 后面的主机,所以我曾经有一个脚本将其地址添加到我的 .ssh/known_hosts 文件中,但最近似乎有些东西发生了变化。我的文件看起来像是受到了哈希怪物的攻击:
|1|Du0QWjqCUrdRK/pnE0PTww2O2Zk=|O31W+SPPLr9+sj1m1K7MfEb+xUQ= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
|1|K3vgE86MLJTHx8W2sPv1cgP4DI0=|Jattsr5sEW443bnyMKT6W0Noc+k= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
|1|UlAukzqGavXZvRtMzjvXmHoVeAQ=|0JVjq7YSFulCHmkF46VFwMV/ZBY= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
- 有没有办法回到旧的、不太安全的方法?
- 如何轻松创建这种散列格式的条目? (我想编写一个脚本来告诉 ssh 10.0.0.0/24 范围内的任何 IP 都应该与给定的指纹匹配。)
答案1
您可以通过将 SSH 客户端选项设置为“no”来禁用主机名哈希HashKnownHosts
:每次在命令行 ( ssh -o HashKnownHosts=no ...
) 上或在用户配置文件中,~/.ssh/config
如下所示:
Host *
HashKnownHosts no
不确定如何自己对主机名进行哈希处理,但您可以在文件中混合使用known_hosts
哈希条目和非哈希条目,因此您的脚本可以创建非哈希条目。
您可以使用ssh-keygen -H
将文件中的所有条目转换known_hosts
为其散列形式。
答案2
如何轻松创建这种散列格式的条目?
您没有说明当前如何将密钥添加到已知的主机文件中,但我假设您正在使用ssh-keyscan
,因为这是专门为此用例设计的工具:
ssh-keyscan
是一个用于收集多个主机的公共 SSH 主机密钥的实用程序。它旨在帮助构建和验证ssh_已知主机文件,其格式记录在SSHD(8)。ssh-keyscan
提供适合 shell 和 perl 脚本使用的最小接口。
所以,我假设您的脚本当前包含这样的行:
# Delete the entry for the old IP
ssh-keygen -R $OLD_IP
# Add entry for the new IP
ssh-keyscan $NEW_IP >> ~/.ssh/known_hosts
您需要做的就是添加-H
旗帜生成散列格式的输出:
ssh-keyscan -H $NEW_IP >> ~/.ssh/known_hosts
(我想编写一个脚本来告诉 ssh 10.0.0.0/24 范围内的任何 IP 都应该与给定的指纹匹配。)
我相信这可以通过更简单的方式实现。
SSH 有一个KnownHostsCommand
配置参数,它允许您指定一个命令,以与已知主机文件相同的格式输出主机密钥行。该命令将在 SSH 读取已知主机文件后调用,并允许您根据当前连接尝试的信息动态添加其他条目。
因此,您可以在 SSH 配置文件中添加如下内容:
Host 10.0.0.*
KnownHostsCommand /usr/bin/env printf "%H ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA"
[我在这里使用这个/usr/bin/env
技巧是因为 SSH 要求 的路径是KnownHostsCommand
绝对的,而 的路径printf
不是标准化的。printf
如果需要,您可以使用系统上的绝对路径。]
所以,这意味着:如果您尝试连接的主机与图案 10.0.0.*
,然后将调用以下命令的结果添加到主机密钥列表中。该命令依次使用代币 %H
(意思是“我们正在尝试查找的主机名”)和您问题中的字符串,为您当前尝试连接的任何 IP 地址构建有效的已知主机密钥行。
无需在已知的主机文件中乱扔 254 个相同的条目。