如何管理我的 .ssh/known_hosts 文件

如何管理我的 .ssh/known_hosts 文件

我在 Virtual Box 中运行带有大量虚拟服务器的 Ubuntu 桌面,以进行测试等。过去,我还曾连接到其他类型的远程 VPS Linux 机箱。目前,我的.ssh/known_hosts文件中有一大堆密钥,其中大多数都不再使用。

我想清理我的.ssh/known_hosts文件,但我怎么知道哪个密钥属于哪个主机?即我怎么知道哪些密钥可以安全删除,哪些密钥应该保留?

答案1

要找出 known_hosts 中哪个条目是已知主机名:

 # ssh-keygen -H  -F <hostname or IP address>

要从 known_hosts 中删除单个条目:

 # ssh-keygen -R <hostname or IP address>

答案2

有困难...

Ubuntu 默认对 known_hosts 文件中的主机名进行哈希处理(这不是默认的 openssh 行为),使得任何读取该文件的人都难以知道您访问的系统。

如果您真的想清除该文件,最简单的选择可能就是删除它并检查您知道的服务器的密钥,但实际上我只会保留known_hosts。

您可以通过注释掉 /etc/ssh/ssh_config 中的选项来阻止对新主机条目进行哈希处理

#HashKnownHosts yes

答案3

如果你有所有主机的列表,你可以这样做

ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts

这将使用基于扫描主机的新生成的文件覆盖您的 .ssh/known_hosts 文件。

并且按照 theotherreceive 的建议去做;HashKnownHosts 在这里带来的烦恼多于帮助。

答案4

我的已知主机文件。不确定它是否适用于所有系统(甚至大多数系统),但这是我的问答脚本。您可能需要调整匹配的字符串或位置。

#!/bin/sh

list=`cat ~/.ssh/known_hosts | awk '{print $1}' |sed -e 's/,/ /g' | sort -u `

listsorted=$(printf "%s\n" ${list[@]} | sort -u)
echo $listsorted
#listsorted="10.2.10.1"
echo > /tmp/sshstat.txt
for host in $listsorted ;
do
echo $host 
ssh -oBatchMode=yes -oConnectTimeout=2  root@${host} "exit" >/tmp/sshstat.txt 2>&1 
ret=$?
if [ $ret -ne 0 ]; then
     echo "Failed: $host"
     echo sed -i.bak \"/$host/d\" "~/.ssh/known_hosts" | sh
else
    grep "Offending RSA" /tmp/sshstat.txt |  sed -e 's/:/ /g' | awk '{printf "sed -i.bak -e \"%dd\" %s  \n", $6, "~/.ssh/known_hosts" }' | sh
   fi
done
#echo $list

相关内容