J'exécute un bureau Ubuntu avec un tas de serveurs virtuels dans Virtual Box pour tester des trucs, etc. Dans le passé, je me suis également connecté à d'autres types de boîtes Linux VPS distantes. Actuellement, mon .ssh/known_hosts
le fichier contient tout un tas de clés, dont la plupart ne sont plus utilisées.
Je veux nettoyer mon .ssh/known_hosts
fichier, mais comment savoir quelle clé appartient à quel hôte? C'est à dire. comment savoir quelles clés je peux retirer en toute sécurité et lesquelles je dois laisser seules?
Pour savoir quelle entrée correspond à un nom d'hôte connu dans les hôtes connus:
# ssh-keygen -H -F <hostname or IP address>
Pour supprimer une seule entrée de known_hosts:
# ssh-keygen -R <hostname or IP address>
Si vous avez une liste de tous vos hôtes, vous pouvez faire quelque chose comme
ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts
Cela remplacera votre fichier .ssh/known_hosts par un fichier nouvellement généré basé sur l'analyse des hôtes.
Et faites aussi ce que l'autre vous suggère; HashKnownHosts est plus ennuyeux que d'aider ici.
Avec difficulté...
Ubuntu par défaut hache les noms d'hôte du fichier known_hosts (ce n'est pas le comportement openssh par défaut), pour qu'il soit difficile pour quiconque lisant le fichier de savoir à quels systèmes vous accédez.
Si vous vouliez vraiment nettoyer le fichier, l'option la plus simple est probablement de simplement le supprimer et de vérifier les clés des serveurs que vous connaissez au fur et à mesure qu'elles surviennent, mais vraiment je laisserais connus_hosts seuls.
Vous pouvez empêcher le hachage de nouvelles entrées d'hôtes en mettant en commentaire l'option dans/etc/ssh/ssh_config
#HashKnownHosts yes
J'avais plus de 300 anciennes entrées périmées dans mon fichier known_hosts. Je ne sais pas si cela fonctionnera pour tous les systèmes (ou même la plupart des systèmes), mais voici mon script Q&D. Vous devrez peut-être ajuster les chaînes ou l'emplacement correspondants.
#!/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