Website-Suche

So automatisieren Sie interaktive CLI-Befehle mit expect


Expect ist ein kostenloses Open-Source-Dienstprogramm, mit dem wir automatisch auf interaktive Eingabeaufforderungen gemäß Skripten antworten können, die Expects/Sende-Befehle enthalten. In diesem Tutorial lernen wir, wie man expect auf den am häufigsten verwendeten Linux-Distributionen installiert, wie man es verwendet, um automatisch auf interaktive Eingabeaufforderungen zu antworten, und wie man expect-Skripte mit autoexpect generiert.

In diesem Tutorial lernen Sie:

  • So installieren Sie expect auf der am häufigsten verwendeten Linux-Distribution
  • Wie schreibe ich ein Expect-Skript?
  • So verwenden Sie autoexpect, um automatisch expect-Skripts zu generieren

Installation erwartet

Obwohl expect in den Repositories aller großen Linux-Distributionen verfügbar ist, wird es normalerweise nicht standardmäßig installiert. Um das Dienstprogramm auf Fedora und anderen Distributionen der Red Hat-Familie, wie z. B. Rocky Linux, zu installieren, können wir den dnf-Paketmanager verwenden:

sudo dnf install expect

Um das Paket auf Debian oder anderen darauf basierenden Distributionen zu installieren, können wir stattdessen Folgendes ausführen:

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

Expect ist auch im Archlinux "Extra"-Repository verfügbar. Wir können mit pacman installieren:

sudo pacman -Sy expect

Erwarten Sie ein Anwendungsbeispiel

Bestimmte Befehlszeilenprogramme und -programme können nicht nur interaktiv arbeiten, sondern ermöglichen es dem Benutzer, die erforderlichen Argumente über dedizierte Optionen zu übergeben. In anderen Fällen fehlen ihnen diese Optionen aus verschiedenen Gründen: Hier kommt expect ins Spiel.

Durch die Erstellung dedizierter Expect-Skripte können wir die Ausführung von Befehlen automatisieren, die eine Benutzerinteraktion erfordern, und vordefinierte Antworten auf erwartete Eingabeaufforderungen liefern. Sehen wir uns einige grundlegende Beispiele an. Hier erstellen wir ein Skript, das eine Frage stellt (Name, Land und E-Mail-Adresse):

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

Das Skript ist trivial, führt keine Datenvalidierung durch, aber es reicht für unseren Zweck aus. Wir speichern es als "prompts.sh" und geben ihm ausführbare Berechtigungen:

chmod +x prompts.sh

Sobald wir es wie erwartet ausführen, werden wir aufgefordert, die angeforderten Informationen bereitzustellen:

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

Sobald wir die erste vom Skript erstellte Eingabeaufforderung beantworten und "Enter" drücken, wird die zweite angezeigt und so weiter. Da wir wissen, wie Eingabeaufforderungen aussehen, können wir ein Expect-Skript erstellen, das sie automatisch für uns beantwortet, ohne jegliche Interaktion. Hier ist es:

#!/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

Das erste, was Ihnen auffallen sollte, ist, dass wir /bin/expect als Skriptinterpreter anstelle von /bin/bash verwendet haben: Dies dient dazu, um zu vermeiden, dass wir gezwungen sind, das Skript als Argument an das expect-Programm zu übergeben (verwechseln Sie es nicht mit dem Namen des Befehls, den wir im Skript verwenden können), jedes Mal, wenn wir ihn aufrufen möchten. In unserem trivialen Skript haben wir drei Befehle verwendet: spawn, expect und send.

Der erste, spawn, führt einen neuen Prozess aus und verbindet die Standardausgabe-, Standardeingabe- und Standardfehlerdatei-Deskriptoren des letzteren, um zu erwarten, so dass er die Programmmeldungen analysieren und die skriptgesteuerten Aktionen ausführen kann.

Der Befehl expect wartet, bis ein bestimmtes Muster mit der Ausgabe der ausführbaren Datei übereinstimmt, die mit dem Befehl spawn gestartet wurde. Im obigen Beispiel kann die Übereinstimmung an einer beliebigen Stelle in der Ausgabe erfolgen. Wenn die Ausgabe des Befehls lautete: "Sag mir, welches Land hast du? ", hätte das Muster trotzdem gepasst. Um eine möglichst strikte Übereinstimmung zu erzwingen, hätten wir die Anker für reguläre Ausdrücke verwenden können: ^ und $. Sie stimmen jeweils mit dem Anfang und dem Ende des Datenstroms überein.

Wenn das Muster nicht mit der Ausgabe übereinstimmt und das Timeout abläuft, wird der Befehl expect zurückgegeben, und die Ausführung des Skripts wird mit der nächsten Anweisung fortgesetzt. Die Standardzeitüberschreitung beträgt 10 Sekunden. Wir können es ändern, indem wir der Variablen "timeout" einen anderen Wert zuweisen:

set timeout 20

Im obigen Beispiel haben wir ein Timeout von 20 Sekunden festgelegt. Wenn Sie den Wert -1 verwenden, wird das Timeout vollständig deaktiviert, sodass expect unbegrenzt wartet, während ein Wert von 0 das gegenteilige Verhalten verursacht: Expect wartet überhaupt nicht.

Der letzte Befehl, den wir verwendet haben, ist send. Der Befehl send sendet eine Zeichenfolge an den Prozess. Beachten Sie, dass wir das Zeichen \n (Zeilenende) in die von uns angegebene Zeichenfolge aufgenommen haben, da standardmäßig keine Formatierung angewendet wird.

In der letzten Zeile des Skripts haben wir anstelle einer bestimmten Nachricht für EOF (End Of File) abgeglichen. Wir speichern das Skript als prompts.exp (die Erweiterung ".exp" ist nur eine Konvention) und machen es ausführbar. Schließlich bringen wir es auf den Markt. Hier ist die Ausgabe:

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

Expect-Skripte mit autoexpect automatisch generieren

Autoexpect ist ein Dienstprogramm, das mit expect einhergeht: Wir können es verwenden, um expect-Skripte als Ergebnis einer interaktiven Sitzung zu generieren. Anstatt ein Expect-Skript von Hand zu schreiben, können wir autoexpect verwenden, um den Befehl auszuführen, der eine Benutzerinteraktion erfordert, z. B.:

autoexpect ./prompts.sh

Das Skript, das wir als Argument für autoexpect bereitstellen, wird ausgeführt. Es erfordert unsere Interaktion, wie es normalerweise der Fall wäre. Sobald das Skript beendet wird, wird jedoch ein Expect-Skript generiert: script.exp. Wenn es ausgeführt wird, repliziert es die Aktionen, die wir interaktiv ausgeführt haben.

Abschließende Gedanken

In diesem Tutorial haben wir die Grundlagen der Verwendung von expect zur Automatisierung interaktiver Befehle gelernt. Wir haben ein sehr einfaches Beispiel dafür gesehen, wie man ein Expect-Skript mit den Befehlen spawn, expect und send schreibt. Schließlich haben wir gesehen, wie es möglich ist, mit dem Dienstprogramm autoexpect automatisch ein Expect-Skript zu generieren. Hier haben wir kaum an der Oberfläche dessen gekratzt, was wir mit Expect-Skripten erreichen können. Bitte werfen Sie einen Blick auf das Expect-Handbuch, um tiefere Kenntnisse zu erhalten.

Verwandte Artikel: