Skip to end of metadata
Go to start of metadata

Le problème

Je gère plus de 100 machines. J'ai paumé mon fichier ~/.ssh/known_hosts et je dois automatiser un script qui doit passer sur toutes ces machines. Je souhaite moissonner les clés ssh de ces machines sans avoir à rentrer moi-même, à chaque nouvelle machine découverte, un « yes » à la question :

The authenticity of host 'example.com (192.0.43.10)' can't be established.
RSA key fingerprint is b0:ba:e5:93:b7:7a:db:ce:3b:46:af:54:e2:13:8f:28.
Are you sure you want to continue connecting (yes/no)?

Mais, je veux aussi, ensuite, bénéficier de la présence de ces certificats dans mon fichier known_hosts, donc, le reconstruire.

La bonne solution

En cherchant longtemps, beaucoup, je vois que la suite d'outils openssh contient un outil qui fait exactement ça : ssh-keyscan. Son usage :

 

Glaner les clés de multiples machines automatiquement et efficacement
ssh-keyscan -f fichier_liste_de_dns_ou_ip_de_machines_une_par_ligne
# exemple avec un fichier de hosts à la *ansible*
time grep -v '^#\|^[[:space:]]*$\|^\[[^]]*\]$' ~/ansible/hosts-def/hosts | ssh-keyscan -H -f - > ~/.ssh/known_hosts

Références

Solutions pas terribles

 

Le problème de ces solutions, c'est que l'acceptation des clés signifie du même coup que la connexion avec la machine distante se fait automatiquement (si on a positionné le certificat qui va bien). Donc pas pratique. Ce qu'il faudrait c'est uniquement récupérer le certificat et ne pas aller plus loin. De toute évidence, ssh n'est pas la commande appropriée.

En utilisant expect

./accepte_ssh_host_keys.expect
#!/usr/bin/expect -f
#
# Ce script accepte les certificats ssh des machines auxquelles on se connecte.
# répond « yes » à :
#
# Are you sure you want to continue connecting (yes/no)?
#
# Utilisation :
# ./accepte_ssh_host_keys.expect <utilisateur@nom.de.machine.com>

set login_et_serveur [lrange $argv 0 0]

spawn ssh $login_et_serveur
match_max 100000
expect "Are you sure you want to continue connecting (yes/no)?*"
send -- "yes\r"
send -- "\r"
close 

Comportement pas très bon avec ce code. Je ne connais pas expect donc c'est sûrement à éviter.

En utilisant les bonnes options ssh qui vont bien

ssh -o StrictHostKeyChecking=no login@machine

 

Références

Voir aussi