Automatisierung von interaktiven Skripten mit ‚expect‘

23.11.2018

Der ein oder andere Entwickler stand sicherlich schon vor dem Problem, dass ein Skript, welches Eingaben vom Benutzer verlangt, automatisiert ausgeführt werden soll.

Während der Durchführung eines Kundenprojekts hatten wir folgende Herausforderung:

Beim Bauen eines Docker Images wird ein Skript ausgeführt. Das Skript entpackt eine vom Kunden gelieferte Binary, welche .run Skripte enthält. Eines dieser .run Skripte wird im Anschluss ausgeführt und verlangt 3 Nutzereingaben. Diese 3 Eingaben konnten wir nicht überspringen.

Wir konnten die .run Skripte in diesem Fall nicht anpassen, um die 3 Eingabeaufforderungen zu entfernen, da die .run Skripte zunächst in der vom Kunden gelieferten Binary steckten und erst entpackt werden mussten, was alles automatisiert ablief.

Das Expect-Command

Die Lösung hat das Kommandozeilentool „expect“ gebracht.

Mit Expect lassen sich interaktive Skripte automatisieren. Man schreibt hierzu ein Expect-Skript, welches das eigentliche Skript ausführt. Das Expect-Skript wartet dann auf bestimmte Ausgaben des ausgeführten Skripts und antwortet mit entsprechend definierten Eingaben:

#!/usr/bin/expect -f

set timeout -1
spawn ./customer_package.run
expect -re "Would you like the installation to configure package1"
send -- "\r" #send 'Enter' to accept default setting
expect -re "Would you like the installation to configure package2"
send -- "\r"
expect -re "Would you like the installation to configure package3"
send -- "\r"
expect eof

Auf diese einfache Art und Weise konnten wir den Aufruf automatisieren. Der hier geschilderte Fall ist eher trivial, Expect bietet jedoch noch viele weitere Möglichkeiten, siehe hier.

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*