Como gerenciar meu arquivo .ssh / known_hosts

43

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?

    
por Luke 21.06.2009 / 04:04

4 respostas

58

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>
    
por 17.09.2010 / 01:50
26

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.

    
por 21.06.2009 / 05:08
20

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
    
por 21.06.2009 / 04:36
2

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
    
por 01.01.2018 / 00:34