autoexpect - Generieren Sie ein Expect-Skript, indem Sie eine Sitzung ansehen
autoexpect [ args ] [ program args... ]
autoexpect beobachtet Ihre Interaktion mit einem anderen Programm und erstellt ein Expect-Skript, das Ihre Interaktionen reproduziert. Bei linearen Skripten spart Autoexpect im Vergleich zum manuellen Schreiben von Skripten erheblich Zeit. Selbst wenn Sie ein Expect-Experte sind, wird es für Sie praktisch sein, Autoexpect zu verwenden, um die sinnloseren Teile von Interaktionen zu automatisieren. Es ist viel einfacher, große Teile von Autoexpect-Skripten auszuschneiden und einzufügen, als sie von Grund auf neu zu schreiben. Und wenn Sie ein Anfänger sind, können Sie vielleicht damit durchkommen, nichts weiter über Expect zu lernen, als wie man autoexpect aufruft.
Der einfachste Weg, autoexpect zu verwenden, besteht darin, es ohne Argumente über die Befehlszeile aufzurufen. Zum Beispiel:
autoexpect
Standardmäßig erzeugt autoexpect eine Shell für Sie. Bei gegebenem Programmnamen und Argumenten erzeugt Autoexpect dieses Programm. Zum Beispiel:
autoexpect ftp ftp.cme.nist.gov
Sobald Ihr erzeugtes Programm ausgeführt wird, interagieren Sie normal. Wenn Sie die Shell (oder das von Ihnen angegebene Programm) verlassen haben, erstellt autoexpect ein neues Skript für Sie. Standardmäßig schreibt autoexpect das neue Skript in „script.exp“. Sie können dies mit dem Flag -f, gefolgt von einem neuen Skriptnamen, überschreiben.
Im folgenden Beispiel wird „ftp ftp.cme.nist.gov“ ausgeführt und das resultierende Expect-Skript in der Datei „nist“ gespeichert.
autoexpect -f nist ftp ftp.cme.nist.gov
Es ist wichtig zu verstehen, dass Autoexpect keine Garantie für ein funktionierendes Skript ist, da es zwangsläufig bestimmte Dinge erraten muss – und gelegentlich auch falsch rät. Allerdings ist es in der Regel sehr einfach, diese Probleme zu erkennen und zu beheben. Die typischen Probleme sind:
Zeitliche Koordinierung. Überraschend viele Programme (rn, ksh, zsh, telnet usw.) und Geräte (z. B. Modems) ignorieren Tastenanschläge, die nach Aufforderungen „zu schnell“ eintreffen. Wenn Sie feststellen, dass Ihr neues Skript an einer Stelle hängen bleibt, versuchen Sie, kurz vor dem vorherigen Senden eine kurze Pause einzufügen.
Sie können dieses Verhalten durchgehend erzwingen, indem Sie die Variable „force_conservative“ am Anfang des generierten Skripts überschreiben. Dieser „konservative“ Modus sorgt dafür, dass Autoexpect automatisch kurz pausiert (eine Zehntelsekunde), bevor jedes Zeichen gesendet wird. Das beruhigt jedes Programm, das ich kenne.
Dieser konservative Modus ist nützlich, wenn Sie sich nur schnell vergewissern möchten, dass das Problem zeitlicher Natur ist (oder wenn es Ihnen wirklich egal ist, wie schnell das Skript ausgeführt wird). Derselbe Modus kann vor der Skriptgenerierung mithilfe des Flags -c erzwungen werden.
Glücklicherweise sind diese Timing-Spots selten. Beispielsweise ignoriert Telnet Zeichen erst nach Eingabe seiner Escape-Sequenz. Modems ignorieren Zeichen nur unmittelbar nach der ersten Verbindung. Einige Programme zeigen dieses Verhalten ständig, verfügen jedoch normalerweise über einen Schalter, um es zu deaktivieren. Beispielsweise deaktiviert das Flag -T von rn dieses Verhalten.
Das folgende Beispiel startet Autoexpect im konservativen Modus.
autoexpect -c
Das Flag -C definiert einen Schlüssel zum Umschalten des konservativen Modus. Das folgende Beispiel startet Autoexpect (im nicht-konservativen Modus) mit ^L als Umschalter. (Beachten Sie, dass das ^L wörtlich eingegeben wird – d. h. geben Sie ein echtes Kontroll-L ein).
autoexpect -C ^L
Das folgende Beispiel startet Autoexpect im konservativen Modus mit ^L als Umschalter.
autoexpect -c -C ^L
Echo. Viele Programme geben Zeichen wieder. Wenn Sie beispielsweise „more“ in eine Shell eingeben, sieht autoexpect tatsächlich Folgendes:
you typed 'm',
computer typed 'm',
you typed 'o',
computer typed 'o',
you typed 'r',
computer typed 'r',
...Ohne spezifische Kenntnisse des Programms ist es unmöglich zu wissen, ob Sie darauf warten, dass jedes Zeichen wiederholt wird, bevor Sie das nächste eingeben. Wenn Autoexpect feststellt, dass Zeichen wiedergegeben werden, geht es davon aus, dass es sie alle als Gruppe senden kann, anstatt sie so zu verschachteln, wie sie ursprünglich angezeigt wurden. Dadurch ist das Skript angenehmer zu lesen. Es könnte jedoch möglicherweise falsch sein, wenn Sie wirklich warten müssten, bis jedes Zeichen wiedergegeben wird.
Ändern. Autoexpect zeichnet jedes Zeichen aus der Interaktion im Skript auf. Dies ist wünschenswert, da es Ihnen die Möglichkeit gibt, zu beurteilen, was wichtig ist und was durch einen Mustervergleich ersetzt werden kann.
Wenn Sie andererseits Befehle verwenden, deren Ausgabe von Ausführung zu Ausführung unterschiedlich ist, sind die generierten Skripte möglicherweise nicht korrekt. Beispielsweise erzeugt der Befehl „Datum“ immer eine andere Ausgabe. Die Verwendung des date-Befehls während der Ausführung von autoexpect ist also eine sichere Möglichkeit, ein Skript zu erstellen, das bearbeitet werden muss, damit es funktioniert.
Das Flag -p versetzt autoexpect in den „Eingabeaufforderungsmodus“. In diesem Modus sucht Autoexpect nur nach der letzten Zeile der Programmausgabe – normalerweise der Eingabeaufforderung. Dies löst das Datumsproblem (siehe oben) und die meisten anderen.
Das folgende Beispiel startet Autoexpect im Eingabeaufforderungsmodus.
autoexpect -p
Das Flag -P definiert eine Taste zum Umschalten des Eingabeaufforderungsmodus. Das folgende Beispiel startet Autoexpect (im Nicht-Eingabeaufforderungsmodus) mit ^P als Umschalter. Beachten Sie, dass das ^P wörtlich eingegeben wird, d. h. geben Sie ein echtes Kontroll-P ein.
autoexpect -P ^P
Das folgende Beispiel startet Autoexpect im Eingabeaufforderungsmodus mit ^P als Umschalter.
autoexpect -p -P ^P
Das Flag -quiet deaktiviert von autoexpect erzeugte Informationsmeldungen.
Das Flag -Q benennt ein Anführungszeichen, das zur Eingabe von Zeichen verwendet werden kann, die sonst von der automatischen Erwartung verbraucht würden, da sie als Umschalter verwendet werden.
Das folgende Beispiel zeigt eine Reihe von Flags mit Anführungszeichen, mit denen die Schalter wörtlich eingegeben werden können.
autoexpect -P ^P -C ^L -Q ^Q
Ich weiß nicht, ob es einen „Stil“ für Expect-Programme gibt, aber Autoexpect sollte auf keinen Fall als Stilmodell angesehen werden. Autoexpect verwendet beispielsweise Funktionen von Expect, die speziell für computergeneriertes Scripting gedacht sind. Versuchen Sie also nicht, Skripte originalgetreu zu schreiben, die so aussehen, als wären sie von Autoexpect generiert worden. Das ist nicht sinnvoll.
Andererseits zeigen Autoexpect-Skripte einige lohnenswerte Dinge. Sie können beispielsweise sehen, wie eine beliebige Zeichenfolge in Anführungszeichen gesetzt werden muss, um sie in einem Tcl-Skript zu verwenden, indem Sie die Zeichenfolgen einfach über Autoexpect ausführen.
"Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Programs" by Don Libes, O'Reilly and Associates, January 1995.
Don Libes, National Institute of Standards and Technology
expect und autoexpect sind gemeinfrei. NIST und ich würden uns über Anerkennung freuen, wenn diese Programme oder Teile davon verwendet würden.