Wenn ein Programm nach einer Benutzereingabe fragt, senden Sie die Antwort ohne jegliche Benutzerinteraktion.
Installation
Debian apt-basierte Systeme wie Ubuntu
sudo apt update
sudo apt install -y expect
Red Hat-basierte Systeme wie Centos
# Centos 7
sudo yum install -y expect
# Centos 8
sudo dnf install -y expect
Wenn Sie Fehler bezüglich des Speicherorts des Expect-Befehls erhalten, können Sie den Speicherort mit dem which-Befehl abrufen:
which expect
which autoexpect
Beispiel
Speichern Sie dies in name.sh
#!/bin/bash
echo "What is your name?"
read name
echo "Your name is ${name}"
Machen Sie das Skript ausführbar:
chmod +x name.sh
# Execute
./name.sh
Wenn ich das Skript manuell ausführe, fordert es mich auf, den Namen mit What is your name?
einzugeben wird dann ausgedruckt, nachdem ich eingetreten bin.
Wir können expect
verwenden um eine automatisierte Antwort auf die Anfrage bereitzustellen. Hier ist das Skript:
Speichern Sie dies in auto.exp
#!/usr/bin/expect
set timeout -1
spawn ./name.sh
expect "What is your name?\r"
send -- "John\r"
expect eof
Lesbar und ausführbar machen:
chmod +x auto.exp
Dies ist die Ausgabe, wenn das Skript mit ./auto.exp
ausgeführt wird :
➜ ./auto.exp
spawn ./name.sh
What is your name?
John
Your name is John
Mit Variablen arbeiten
Sie können den set-Befehl verwenden, um Variablen in Expect-Skripten wie folgt zu definieren:
set user kip
set age 10
Um auf die Variable zuzugreifen, stellen Sie ihr $
voran wie in bash (z.B. $user
)
Um Befehlszeilenargumente in Expect-Skripten zu definieren, verwenden wir die folgende Syntax:
set USER [lindex $argv 0]
Hier definieren wir eine Variable USER, die dem ersten übergebenen Argument entspricht.
Sie können das erste und das zweite Argument erhalten und sie wie folgt in Variablen speichern:
set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
Beispiel für ein Skript mit Variablen
Eine andere Möglichkeit, ohne ein Skript zu erstellen:
Beispiel zum Ändern des sftp-Passworts. Speichern Sie diese unter ./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"
Führen Sie das Skript mit
aus./sftp_password_change.exp $curpass $newpass $user $server
Automatisch erwarten
autoexpect
Befehl können Sie Ihr Skript als Argument angeben, dann wird es das Skript für Sie erstellen.
Sie verwenden einen Befehl wie autoexpect ./installapp und es wird ein erwartetes Skript mit den von Ihnen bereitgestellten Antworten erstellen:
$ autoexpect ./name.sh
autoexpect started, file is script.exp
What is your name?
John
Your name is John
autoexpect done, file is script.exp
Die resultierende script.exp
Die Datei enthält dann eine Erklärung, dass sie mit Autoexpect erstellt wurde, und enthält die von Ihnen bereitgestellten Antworten.
Das Autoexpect-Tool bereitet das Skript für die nicht interaktive Ausführung einer Installation vor. Sie können dann Installationen durchführen, ohne die Details angeben zu müssen, oder sie einfach so planen, dass sie eigenständig ausgeführt werden.
Dies ist der generierte Inhalt ohne Kommentare
$ 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
Schlussfolgerung
Der expect
Der Befehl ist praktisch zum Ausführen von Skripten, die eine lange Reihe von Antworten erfordern, und ermöglicht es Ihnen, sie unbemannt auszuführen, während autoexpect es einfach macht, erwartete Skripte zu erstellen, ohne sich um die syntaktischen Details zu kümmern.