expect: de l’interactif à l’automatique

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 programme
  • expect pour attendre un affichage sur la sortie standard
  • send 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à ? ».