it-swarm.cn

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

我在Virtual Box中运行带有一堆虚拟服务器的Ubuntu桌面,以测试东西等。过去,我还一直在连接到其他种类的远程VPS Linux Box。目前我的.ssh/known_hosts文件中有一堆键,其中大多数不再使用。

我想清理我的.ssh/known_hosts文件,但是我怎么知道哪个密钥属于哪个主机?即我怎么知道我可以安全地卸下哪些钥匙以及应该独自留下哪些钥匙?

49
Luke

要找出已知主机名中哪个主机名称项:

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

要从known_hosts删除单个条目:

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

如果您有所有主机的列表,则可以执行以下操作

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

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

并按照别人的建议去做; HashKnownHosts比这里的帮助更令人烦恼。

27
freiheit

有困难...

默认情况下,Ubuntu将主机名散列到known_hosts文件中(这不是默认的openssh行为),从而使读取该文件的任何人都很难知道您要访问的系统。

如果您真的想清除文件,最简单的选择可能就是删除它,并在出现服务器时检查服务器的密钥,但实际上,我只剩下known_hosts。

您可以通过注释掉/ etc/ssh/ssh_config中的选项来阻止新主机条目被散列

#HashKnownHosts yes
21
theotherreceive

我的known_hosts文件中有300多个陈旧的条目。不确定它是否适用于所有系统(甚至大多数系统),但这是我的Q&D脚本。您可能需要调整匹配的字符串或位置。

#!/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  [email protected]${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
2
user1953828