Quand on se connecte à un serveur en SSH, un serveur FTP ou au VPN de notre entreprise, on est amené à saisir un nom d’utilisateur et un mot de passe, et ce de manière interactive.
Si la sécurité interdit en principe à ces commandes de saisir le mot de passe sur la ligne de commande, on aimerait bien dans certains cas pouvoir rendre automatiques ces opérations interactives.
C’est là qu’intervient expect, un outil d’automatisation et de tests de non-régression écrit à la fin des années 1980. Ecrit au départ pour tester des applications comme telnet
, ftp
ou ssh
, on peut l’utiliser maintenant pour se faciliter la vie au quotidien, que l’on soit développeur ou administrateur système.
Imaginons que je sois en train de mettre à jour un dépôt Git qui a été cloné en https. La commande git pull
va me demander mon nom d’utilisateur et mon mot de passe, et ce à chaque fois !
Si maintenant, je crée le fichier suivant:
#
#!/usr/bin/expect -f
#
set timeout -1
spawn git pull
match_max 100000
expect -exact "Username for 'https://framagit.org': "
send -- "xxxxxxxxx@gmail.com\r"
expect -exact "xxxxxxxxx@gmail.com\r
Password for 'https://xxxxxxxxx@gmail.com@framagit.org': "
send -- "yyyyyyyyy\r"
expect eof
Et que je l’exécute, expect
va lancer la commande git pull
et faire comme si j’avais saisi manuellement mon nom d’utilisateur et mon mot de passe.
expect
comprend un certain nombre de commandes dont:
spawn
pour lancer un programmeexpect
pour attendre un affichage sur la sortie standardsend
pour envoyer une chaîne de caractères au programme lançé
La command man expect
vous donnera bien plus de précisions sur les commandes possibles.
Mais ce n’est pas tout !
Le script expect
précédent n’a pas nécessairement besoin d’être écrit par vos soins, et c’est la qu’intervient la commande autoexpect
.
Si vous lancez la commande:
$ autoexpect -f git-pull
autoexpect started, file is git-pull
Et qu’ensuite vous saisisez la commande git pull
puis vos paramètres de connexion puis Ctrl-D, vous obtiendrez le fichier précédent – avec quelques instructions et des commentaires en plus !!!
En clair, vous avez automatisé votre saisie interactive en « l’enregistrant » en quelque sorte.
Et chaque fois que vous saisirez ./git-pull
, votre dépôt sera mis à jour.
Vous aurez bien noté que votre mot de passe se trouve enregistré en clair dans le fichier expect
, mais lorsqu’il s’agit de se connecter à un serveur partagé par une équipe de développement, ça ne pose pas de problèmes et évite les questions du genre: « C’est quoi le mot de passe du serveur de test déjà ? ».