Answers:
有困难...
默认情况下,Ubuntu将主机名散列到known_hosts文件中(这不是默认的openssh行为),从而使任何人都很难读取该文件来知道您要访问的系统。
如果您真的想清除文件,最简单的选择可能就是删除它,并在出现服务器时检查服务器的密钥,但实际上,我只剩下known_hosts。
您可以通过注释掉/ etc / ssh / ssh_config中的选项来阻止新主机条目被散列
#HashKnownHosts yes
ssh root@something-new-or-new-dns-alias
。这将刷新原始known_hosts
文件并解密主机名/ IP。
我的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 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
known_hosts
文件上不起作用,并且由于发问者询问“我如何知道哪个密钥属于哪个主机”,我认为他的文件很有可能被散列了。他说他在Ubuntu上,并且theotherreceive
说,Ubuntu默认是哈希值。
ssh-keyscan
具有非常严格的list_of_hosts
文件格式规则。每个地址后的地址只能是地址,而不能是其他空格。这包括最后一个地址之后的LF。否则,在生成的文件中会产生很多垃圾。