Recherche de site Web

Comment automatiser les commandes de l’interface de ligne de commande interactive avec expect


Expect est un utilitaire gratuit et open source que nous pouvons utiliser pour répondre automatiquement aux invites interactives selon des scripts qui incluent des commandes expects/ends. Dans ce tutoriel, nous apprenons comment installer expect sur les distributions Linux les plus utilisées, comment l’utiliser pour répondre automatiquement aux invites interactives et comment générer des scripts expect avec autoexpect.

Dans ce tutoriel, vous allez apprendre :

  • Comment installer expect sur la distribution Linux la plus utilisée
  • Comment écrire un script expect
  • Comment utiliser autoexpect pour générer automatiquement des scripts expect

Installation expect

Bien que expect soit disponible dans les dépôts de toutes les principales distributions Linux, il n’est généralement pas installé par défaut. Pour installer l’utilitaire sur Fedora et d’autres distributions de la famille Red Hat, telles que Rocky Linux, nous pouvons utiliser le gestionnaire de paquets dnf :

sudo dnf install expect

Pour installer le paquet sur Debian ou d’autres distributions basées sur celui-ci, nous pouvons exécuter :

sudo apt-get update && sudo apt-get install expect

Expect est également disponible dans le dépôt « Extra » d’Archlinux. Nous pouvons installer à l’aide de pacman :

sudo pacman -Sy expect

Exemple d’utilisation attendue

Certains utilitaires et programmes de ligne de commande, en plus de pouvoir fonctionner de manière interactive, permettent à l’utilisateur de passer les arguments requis via des options dédiées. Dans d’autres cas, pour diverses raisons, ils n’ont pas ces options : c’est là que l’attente est utile.

En créant des scripts expect dédiés, nous pouvons automatiser l’exécution des commandes qui nécessitent une interaction de l’utilisateur, en fournissant des réponses prédéfinies aux invites attendues. Voyons quelques exemples de base. Ici, nous créons un script qui pose une question (nom, pays et adresse e-mail) :

#!/bin/bash 
read -p "What is your name? " name 
read -p "What is your country? " country 
read -p "Enter your email address: " email

Le script est trivial, n’effectue aucune validation de données, mais il est suffisant pour notre objectif. Nous l’enregistrons sous le nom « prompts.sh « , et lui donnons les permissions exécutables :

chmod +x prompts.sh

Une fois que nous l’avons exécuté, comme prévu, il nous invite à fournir les informations demandées :

./prompts.sh
What is your name? Egidio
What is your country? Italy
Enter your email address: nomail@gmail.com

Une fois que nous répondons à la première invite créée par le script et que nous appuyons sur « Entrée », la seconde s’affiche, et ainsi de suite. Comme nous savons à quoi ressemblent les invites, nous pouvons créer un script d’attente qui y répond automatiquement pour nous, sans aucune interaction. Le voilà:

#!/bin/expect 
spawn ./prompts.sh 
expect "What is your name?" { send "Egidio\n" }
expect "What is your country?" { send "Italy\n" }
expect "Enter your email address" { send "nomail@gmail.com\n" }
expect EOF

La première chose que vous devriez remarquer, c’est que nous avons utilisé /bin/expect comme interpréteur de script, au lieu de /bin/bash : c’est pour éviter d’être obligé de passer le script en argument au programme expect (ne le confondez pas avec le nom de la commande que nous pouvons utiliser dans le script), à chaque fois que nous voulons l’invoquer. Dans notre script trivial, nous avons utilisé trois commandes : spawn, expect et send.

Le premier, spawn, exécute un nouveau processus, et connecte les descripteurs de fichier de sortie standard, d’entrée standard et de fichier d’erreur standard du second, à attendre, afin qu’il puisse analyser les messages du programme et effectuer les actions scriptées.

La commande expect attend qu’un certain motif corresponde à la sortie de l’exécutable lancé avec la commande spawn. Dans l’exemple ci-dessus, la correspondance peut se produire n’importe où dans la sortie. Si le résultat de l’ordre était : « Dites-moi, quel est votre pays ? », le schéma aurait néanmoins correspondu. Pour imposer une correspondance des plus strictes, nous aurions pu utiliser des ancres d’expressions régulières : ^ et $. Ils correspondent, respectivement, au début et à la fin du flux de données.

Si le motif ne correspond pas à la sortie et que le délai d’expiration expire, la commande expect est renvoyée et l’exécution du script se poursuit jusqu’à l’instruction suivante. Le délai d’expiration par défaut est de 10 secondes ; On peut le changer en attribuant une valeur différente à la variable « timeout » :

set timeout 20

Dans l’exemple ci-dessus, nous définissons un délai d’expiration de 20 secondes ; L’utilisation d’une valeur de -1 désactive complètement le délai d’expiration, de sorte que expect attend indéfiniment, tandis qu’une valeur de 0 provoque le comportement inverse : expect n’attend pas du tout.

La dernière commande que nous avons utilisée est send. La commande send envoie une chaîne de caractères au processus. Notez que nous avons inclus le caractère \n (fin de ligne) dans la chaîne que nous avons fournie, car aucun formatage n’est appliqué par défaut.

Dans la dernière ligne du script, au lieu d’un message spécifique, nous avons fait correspondre pour EOF (End Of File). Nous enregistrons le script sous le nom prompts.exp (l’extension « .exp " n’est qu’une convention) et le rendons exécutable. Enfin, nous le lançons. Voici son résultat :

./script.exp 
spawn ./prompts.sh
What is your name? Egidio
What is your country? Italy
Enter your email address: nomail@gmail.com

Générer automatiquement des scripts d’attente avec autoexpect

Autoexpect est un utilitaire qui se connecte avec expect : nous pouvons l’utiliser pour générer des scripts expect à la suite d’une session interactive. Au lieu d’écrire un script expect à la main, nous pouvons utiliser autoexpect pour exécuter la commande qui nécessite une interaction de l’utilisateur, par exemple :

autoexpect ./prompts.sh

Le script que nous fournissons en argument pour autoexpect s’exécute ; Cela nécessite notre interaction, comme cela serait normalement le cas. Cependant, une fois le script fermé, un script expect est généré : script.exp. Une fois exécuté, il répliquera les actions que nous avons effectuées de manière interactive.

Réflexions finales

Dans ce tutoriel, nous avons appris les bases de l’utilisation des commandes interactives expect to automat. Nous avons vu un exemple très basique de la façon d’écrire un script expect, en utilisant les commandes spawn, expect et end. Enfin, nous avons vu comment il est possible de générer automatiquement un script expect à l’aide de l’utilitaire autoexpect. Ici, nous avons à peine effleuré la surface de ce que nous pouvons réaliser en utilisant les scripts expect. Veuillez consulter le manuel d’attente pour une connaissance plus approfondie.

Articles connexes: