Lorsqu'un programme demande une entrée utilisateur, attendez-vous à envoyer la réponse sans aucune interaction de l'utilisateur.
Installation
Systèmes basés sur Debian apt comme Ubuntu
sudo apt update
sudo apt install -y expect
Systèmes basés sur Red Hat comme Centos
# Centos 7
sudo yum install -y expect
# Centos 8
sudo dnf install -y expect
Si vous obtenez des erreurs sur l'emplacement de la commande Expect, vous pouvez obtenir l'emplacement à l'aide de la commande which :
which expect
which autoexpect
Exemple
Enregistrez ceci dans name.sh
#!/bin/bash
echo "What is your name?"
read name
echo "Your name is ${name}"
Rendre le script exécutable :
chmod +x name.sh
# Execute
./name.sh
Lorsque j'exécute le script manuellement, il me demande d'entrer le nom avec What is your name?
puis imprime après que j'entre.
Nous pouvons utiliser expect
pour fournir une réponse automatisée à la requête. Voici le script :
Enregistrez-le dans auto.exp
#!/usr/bin/expect
set timeout -1
spawn ./name.sh
expect "What is your name?\r"
send -- "John\r"
expect eof
Rendre lisible et exécutable :
chmod +x auto.exp
Ceci est la sortie lorsque le script est exécuté avec ./auto.exp
:
➜ ./auto.exp
spawn ./name.sh
What is your name?
John
Your name is John
Travailler avec des variables
Vous pouvez utiliser la commande set pour définir des variables dans des scripts attendus comme celui-ci :
set user kip
set age 10
Pour accéder à la variable, faites-la précéder de $
comme dans bash (par exemple $user
)
Pour définir les arguments de ligne de commande dans les scripts attendus, nous utilisons la syntaxe suivante :
set USER [lindex $argv 0]
Ici, nous définissons une variable USER, qui est égale au premier argument passé.
Vous pouvez obtenir le premier et le second arguments et les stocker dans des variables comme ceci :
set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
Exemple de script avec variables
Une autre façon de procéder sans créer de script :
Exemple pour changer le mot de passe sftp. Enregistrez-les dans ./sftp_password_change.exp
.
#!/usr/bin/expect
set timeout 10
set curpass [lindex $argv 0];
set newpass [lindex $argv 1];
set user [lindex $argv 2];
set server [lindex $argv 3];
expect <<EOF
spawn sftp -P 15422 [email protected]$server
expect "Password:"
send "$curpass\r"
expect "Old Password:"
send "$curpass\r"
expect "New Password:"
send "$newpass\r"
expect "Reenter New Password:"
send "$newpass\r"
expect "sftp>"
send "exit\n"
Exécutez le script avec
./sftp_password_change.exp $curpass $newpass $user $server
Attente automatique
autoexpect
La commande vous permet de fournir votre script comme argument, puis elle créera le script pour vous.
Vous utilisez une commande comme autoexpect ./installapp et elle construira un script expect avec les réponses que vous fournissez :
$ autoexpect ./name.sh
autoexpect started, file is script.exp
What is your name?
John
Your name is John
autoexpect done, file is script.exp
Le résultat script.exp
le fichier inclura alors une explication indiquant qu'il a été créé avec une attente automatique et inclura les réponses que vous avez fournies.
L'outil autoexpect prépare le script pour l'exécution non interactive d'une installation. Vous pouvez ensuite effectuer des installations sans avoir à fournir les détails ou simplement les planifier pour qu'elles s'exécutent d'elles-mêmes.
Ceci est le contenu généré sans commentaires
$ cat script.exp
#!/usr/bin/expect -f
#
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
set timeout -1
spawn ./name.sh
match_max 100000
expect -exact "What is your name?\r
"
send -- "John\r"
expect eof
Conclusion
Le expect
La commande est pratique pour exécuter des scripts qui nécessitent une longue série de réponses et vous permet de les exécuter de manière autonome, tandis que l'attente automatique facilite la création de scripts attendus sans vous soucier des détails syntaxiques.