... article suivant

Publié le 29 octobre 2007 par Peck
Retrouvez cet article sur http://linux-attitude.fr/post/article-suivant

Niveau
:
Résumé : ssh root@<tab>

Rappelons le contexte, on veut pouvoir faire de la complétion automatique sur les noms de machine. La plupart des distributions ont déjà défini un fichier /etc/bash_completion qui fait ceci. Pour le faire, il lit le fichier ~/.ssh/known_hosts. On veut donc récupérer un fichier known_hosts complet pour permettre la complétion automatique. Et ô magie, il existe un outil presque tout fait pour faire ca : ssh-keyscan.
C'est un outil qui va récupérer pour vous toutes les clés publiques des serveurs ssh que vous lui demandez. Mieux, il les met au format known_hosts, mieux il sait le faire en parallèle. Donc reprenons notre script d'hier et adaptons :

#!/bin/sh
# fichier hosts
FILE=~/.hosts
# domaines à scanner
DOMAINS="toto.net mamachine.net"
# machines à ajouter à la main (plus d'ip du tout)
cat > $FILE << EOF
mamachine.youpi.fr
tamachine.youpi.fr
EOF
for domaine in $DOMAINS
do
  dig $domaine axfr | egrep "IN[[:space:]]+A" | awk '{print  $1}' >> $FILE
done
# grep pour quelques petits bugs
grep -v "[#_*]" $FILE | ssh-keyscan -t rsa,dsa -f - > ~/.ssh/known_hosts

Petit inconvénient, ssh-keyscan s'arrête dès qu'il y a une erreur de résolution de nom. Pas cool, vous devez le relancer en filtrant mieux lorsque vous tombez sur une erreur.


Et voilà !

Enfin presque, car vous avez bien récupéré les clés, c'est pratique pour votre utilisation de ssh, mais qu'en est-il des nouvelles machines auxquelles vous accédez ? Elles sont naturellement ajoutées au fichier known_hosts, mais il existe deux méthodes pour stocker les noms de machine dans le known_hosts, soit en clair, soit hashé.

Et pour que la complétion fonctionne, il faut nécessairement que ce soit en clair. Donc option  "HashKnownHosts no " dans .ssh/config. Mais attention, l'option a été inventée pour qu'en cas de compromission de votre machine l'attaquant ne sache pas quelles sont les machines que vous administrez régulièrement (pour tenter de s'y attaquer).

Vous abandonnerez donc une protection (somme toute légère), et en contrepartie vous avez une complétion avancée sous bash. Mieux, si votre agent tourne et que vous avez poussé vos clés sur les machines en question, la complétion fonctionnera aussi sur les noms de fichiers distants, exemple :
$ scp toto@machine:/<tab><tab> # root c'est mâaal !

Victoire !