Nom d'une machine !

Publié le 28 octobre 2007 par Peck
La dernière version sur http://linux-attitude.fr/post/Nom-dune-machine

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

Je suis sûr qu'il vous arrive souvent de taper ssh toto@mamachine.monreseau.net. Tellement souvent que vous avez fini par modifier votre ~/.ssh/config pour y mettre des alias. Pour ceux qui ont oublié comment faire voici la ligne à mettre :

Host machine
   Hostname mamachine.monreseau.net

Au passage vous pouvez ajouter le port et le login par défaut dans cette configuration.

Host machine
   Hostname mamachine.monreseau.net
   Port 1022
   User toto


Bien, maintenant quelque chose de tout aussi sympathique. Il est possible de demander à bash de compléter ces noms de machine, plutôt que de les entrer tout seul comme un grand.
En effet, bash dispose de la complétion sur les noms de machine. Le simple fait de préfixer un nom par @ permet à ssh de supposer que c'est un nom de machine. Mais alors comment fait-il pour les connaître tous ? Il lit la variable $HOSTFILE qui doit contenir le nom d'un fichier au format /etc/hosts. Si elle est vide il lit le fichier /etc/hosts.

Donc : ssh root@l<tab> complète toujours au moins par localhost (ou presque).

Bien, mais nous n'allons pas remplir le fichier /etc/hosts à la main tout de même !

Non, nous allons faire mieux. Hop un script shell :

#!/bin/sh
# fichier hosts personnel
FILE=~/.hosts
# domaines à scanner
DOMAINS="toto.net mamachine.net"
# machines à ajouter à la main (l'IP b'est pas vraiment obligatoire)
cat > $FILE << EOF
1 mamachine.youpi.fr
2 tamachine.youpi.fr
EOF
for domaine in $DOMAINS
do
  dig $domaine axfr | egrep "IN[[:space:]]+A" | awk '{print  $5,$1}' >> $FILE
done


Bien sûr on pourrait le faire en perl, d'ailleurs, ne vous gênez pas. On pourrait aussi séparer la configuration dans un autre fichier. En attendant c'est simple et ça tient dans un fichier. Ce script scanne des domaines en leur envoyant la commande axfr et y ajoute une liste personnelle de machines. Attention, rares sont les domaines qui acceptent la commande axfr de l'extérieur, ce qui veut dire que (logique) elle doit s'appliquer à des serveurs que vous gérez, ou tout au moins pour lesquels vous avez un accès privilégié (interne).

Maintenant il vous reste à le lancer (au moins une fois), à ajouter une ligne dans votre .bashrc :
export HOSTFILE=~/.hosts

Et à ajouter ce script dans une crontab pour être toujours à jour de la liste de vos machines.

Attention, si vous avez un bash récent avec une distrib sympa, la complétion par HOSTFILE est désactivée et est remplacée par une complétion par known_hosts. Si vous voulez la réactiver, il faut taper la commande suivante (ou ne pas inclure le /etc/bash_completion) :
$ shopt -s hostcomplete

Si vous préférez la complétion telle que définie dans le bash_completion, il vous faudra avoir toutes vos machines dans votre fichier ~/.ssh/known_host. Et pour cela attendez l'article suivant ...