我试图找到一个脚本解密(取消哈希)known_hosts 文件中的 ssh 主机名通过传递主机名列表。
所以,要做正好相反:
ssh-keygen -H -f known_hosts
或者,如果 ssh 配置 HashKnownHosts 设置为 No,则执行与此相同的操作:
ssh-keygen -R know-host.com -f known_hosts
ssh-keyscan -H know-host.com >> known_hosts
但无需重新下载主机密钥(由 ssh-keyscan 引起)。
就像是:
ssh-keygen --decrypt -f known_hosts --hostnames hostnames.txt
其中 hostnames.txt 包含主机名列表。
答案1
中的行known_hosts
未加密,而是经过哈希处理。您无法解密它们,因为它们没有加密。你不能“取消散列”它们,因为那是什么散列就是——给定哈希值,不可能发现原始字符串。 “unhash”的唯一方法是猜测原始字符串并验证您的猜测。
如果您有主机名列表,则可以将它们传递给ssh-keygen -F
并用主机名替换它们。
while read host comment; do
found=$(ssh-keygen -F "$host" | grep -v '^#' | sed "s/^[^ ]*/$host/")
if [ -n "$found" ]; then
ssh-keygen -R "$host"
echo "$found" >>~/.ssh/known_hosts
fi
done <hostnames.txt
1从实际意义上讲,即当今存在的所有计算机需要比当前宇宙年龄更长的时间才能完成这项任务。
答案2
ssh-keygen(1) 手册页显示该-F hostname
选项:
在known_hosts 文件中搜索指定的主机名,列出找到的所有匹配项。此选项对于查找散列主机名或地址很有用,也可以与
-H
以散列格式打印找到的密钥的选项结合使用。
这似乎就是你想要的。
答案3
我发现这些新的加密文件只是简单地管理已知主机。将文本复制并粘贴到另一个位置,然后在加密的known_hosts 行上方添加有关 ip 和设备的注释。尝试解密它们并不能提供您需要的信息。