Login
Newsletter
Mi, 14. Juli 2004, 01:05

Konsolenprogramm mit expect fernsteuern

Wer schon einmal mehrere Benutzer auf einem System eingerichtet hat, hat sich sicher geärgert, dass man dem »passwd«-Programm nicht gleich das Passwort mitteilen kann, sondern dass es das Passwort unbedingt von der Konsole lesen will.

Doch dagegen ist ein Kraut gewachsen - oder besser - ein Programm: expect. expect ist zunächst einmal nicht viel mehr als ein TCL-Interpreter, doch kann er Programme starten und mit ihnen kommunizieren und bei Bedarf dem Benutzer die Kommunikation überlassen. Als Beispiel ist hier ein kleines expect-Script zum Aufbau einer FTP-Verbindung:

#!/usr/bin/expect

Zunächst mal das Programm "ftp" starten:

spawn /usr/bin/ftp

Auf die Zeichenfolge "ftp>" warten und bei Erfolg "open ftp.fu-berlin.de\n" senden, wobei "\n" für einen Zeilenumbruch steht:

expect "ftp>" { send "open ftp.fu-berlin.de\n" }

Wie es nun weitergeht, hängt von der Ausgabe des ftp-Clients ab. Liefert er "Connection refused", "Connection timed out" oder "Unknown host" zurück, werden entsprechende Fehlermeldungen an den Benutzer ausgegeben. Fragt der FTP-Server nach unserem Namen, schicken wir ihm "anonymous":

expect {
 "Connection refused" { send "quit"
 send_user "Connection was refused.\n"
 exit 1 }
 "Connection timed out" { send "quit"
 send_user "Connection timed out.\n"
 exit 2 }
 "Unknown host" { send "quit"
 send_user "Unknown host. ftp.fu-berlin.de\n"
 exit 3 }
 "Name" { send "anonymous\r" }
}


Nun erwarten wir die Passwortabfrage des FTP-Servers und antworten mit etwas, was wie eine Email-Adresse aussieht:

expect "Password" { send [exec whoami]@[exec hostname]"\n" }

Wenn wir daraufhin wieder am "ftp>"-Prompt landen, wechseln wir in ein Verzeichnis:

expect "ftp>" { send "cd /unix/linux/mirrors/ftp.kernel.org/kernel/v2.6\n" }

und lassen uns eine Liste der dort vorhandenen Dateien schicken:

expect "CWD command successful." { send "ls\n" }

Hat auch das geklappt, kann das expect-Script alle weiteren Interaktionen dem Benutzer überlassen:

expect "Transfer complete" { interact }

Soviel zu einem einfachen Beispiel. Letzten Endes sind einem aber kaum Grenzen bei der Verwendung von expect gesetzt, da einem ja der gesamte Umfang der Programmiersprache TCL zur Verfügung steht. Unter expect.nist.gov/example finden sich zahlreiche Beispiele, am herausragendsten wohl "multixterm", das mehrere xterms mit dem selben Eingabestrom verbindet. Was man in ein Fenster schreibt, das erscheint auch in den anderen.
So lassen sich zum Beispiel viele gleichartige Rechner administrieren.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten