Quando un programma richiede l'input dell'utente, aspettati di inviare la risposta senza alcuna interazione dell'utente.
Installazione
Sistemi basati su Debian apt come Ubuntu
sudo apt update
sudo apt install -y expect
Sistemi basati su Red Hat come Centos
# Centos 7
sudo yum install -y expect
# Centos 8
sudo dnf install -y expect
Se ricevi errori sulla posizione del comando Expect, puoi ottenere la posizione utilizzando il comando which:
which expect
which autoexpect
Esempio
Salvalo in name.sh
#!/bin/bash
echo "What is your name?"
read name
echo "Your name is ${name}"
Rendi eseguibile lo script:
chmod +x name.sh
# Execute
./name.sh
Quando eseguo manualmente lo script, mi viene chiesto di inserire il nome con What is your name?
quindi viene stampato dopo che sono entrato.
Possiamo usare expect
per fornire una risposta automatica alla domanda. Ecco lo script:
Salvalo in auto.exp
#!/usr/bin/expect
set timeout -1
spawn ./name.sh
expect "What is your name?\r"
send -- "John\r"
expect eof
Rendi leggibile ed eseguibile:
chmod +x auto.exp
Questo è l'output quando lo script viene eseguito con ./auto.exp
:
➜ ./auto.exp
spawn ./name.sh
What is your name?
John
Your name is John
Lavorare con le variabili
Puoi usare il comando set per definire le variabili negli script Expect come questo:
set user kip
set age 10
Per accedere alla variabile, precederla con $
come in bash (es. $user
)
Per definire gli argomenti della riga di comando negli script Expect, utilizziamo la seguente sintassi:
set USER [lindex $argv 0]
Qui definiamo una variabile USER, che è uguale al primo argomento passato.
Puoi ottenere il primo e il secondo argomento e archiviarli in variabili come questa:
set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
Esempio di script con variabili
Un altro modo per farlo senza creare uno script:
Esempio per cambiare la password sftp. Salvali in ./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"
Esegui lo script con
./sftp_password_change.exp $curpass $newpass $user $server
Aspettativa automatica
autoexpect
command ti consente di fornire il tuo script come argomento, quindi creerà lo script per te.
Usi un comando come autoexpect ./installapp e creerà uno script Expect con le risposte che fornisci:
$ autoexpect ./name.sh
autoexpect started, file is script.exp
What is your name?
John
Your name is John
autoexpect done, file is script.exp
Il risultante script.exp
il file includerà quindi una spiegazione che è stato creato con autoexpect e includerà le risposte che hai fornito.
Lo strumento autoexpect prepara lo script per l'esecuzione non interattiva di un'installazione. È quindi possibile eseguire installazioni senza dover fornire i dettagli o semplicemente programmarle per l'esecuzione autonoma.
Questo è il contenuto generato senza commenti
$ 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
Conclusione
Il expect
Il comando è utile per eseguire script che richiedono una lunga serie di risposte e ti consente di eseguirli in modo non presidiato, mentre autoexpect semplifica la creazione di script attendibili senza stressare i dettagli sintattici.