Para descobrir qual entrada é para um nome de host conhecido em known_hosts:
# ssh-keygen -H -F <hostname or IP address>
Para excluir uma única entrada de known_hosts:
# ssh-keygen -R <hostname or IP address>
Eu corro um desktop Ubuntu com um monte de servidores virtuais no Virtual Box para testar coisas, etc. No passado eu também tenho me conectado a outros tipos de caixas VPS Linux remotas. Atualmente meu arquivo .ssh/known_hosts
tem um monte de chaves nele, a maioria das quais não está mais sendo usada.
Desejo limpar meu arquivo .ssh/known_hosts
, mas como sei qual chave pertence a qual host? Ou seja Como sei quais teclas posso remover com segurança e quais devo deixar em paz?
Se você tem uma lista de todos os seus hosts, você pode fazer algo como
ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts
Isso substituirá seu arquivo .ssh / known_hosts por um recém-gerado, baseado na varredura dos hosts.
E também faça o que o outro destinatário sugere; HashKnownHosts é mais aborrecimento do que ajuda aqui.
Com dificuldade ...
O Ubuntu, por padrão, não nomeia host no arquivo known_hosts (este não é o comportamento padrão do openssh), para dificultar que qualquer pessoa que esteja lendo o arquivo saiba quais sistemas você acessa.
Se você realmente quisesse limpar o arquivo, a opção mais simples é provavelmente excluí-lo e verificar as chaves dos servidores que você conhece, mas na verdade eu deixaria os known_hosts sozinhos.
Você pode impedir que novas entradas de hosts sejam alteradas, comentando a opção em / etc / ssh / ssh_config
#HashKnownHosts yes
Eu tinha mais de 300 entradas antigas antigas no meu arquivo known_hosts. Não tenho certeza se ele funcionará para todos os sistemas (ou até para a maioria dos sistemas), mas aqui está o meu script Q & D. Talvez seja necessário ajustar as sequências ou a localização correspondente.
#!/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