2009-12-09 3 views
5

Ich schreibe ein Expect-Skript und habe Probleme mit der Shell-Eingabeaufforderung (unter Linux). Mein Expect-Skript erstellt rlogin und das Remote-System verwendet ksh. Die Eingabeaufforderung auf dem Remote-System enthält das aktuelle Verzeichnis, gefolgt von " > " (Leerzeichen größer als Leerzeichen). Ein Skript-Schnipsel könnte sein:Wie kann ich den Eingabepuffer in einem Expect-Skript leeren?

send "some command here\r" 
expect " > " 

Dies funktioniert für einfache Befehle, aber die Dinge beginnen, falsch zu gehen, wenn der Befehl, den ich die Sende mich die Breite des Anschlusses übersteigt (oder genauer gesagt, was ksh denkt, ist die Breite Das Terminal). In diesem Fall führt ksh ein merkwürdiges horizontales Scrollen der interaktiven Befehlszeile durch, das die Eingabeaufforderung neu zu schreiben scheint und ein zusätzliches ">" in die Ausgabe einfügt. Dies führt natürlich dazu, dass das Expect-Skript verwirrt und nicht mehr synchron ist, wenn in der Ausgabe nach der Ausführung eines Befehls mehr als eine Eingabeaufforderung angezeigt wird (mein Skript enthält mehrere Paare send/expect).

Ich habe versucht, PS1 auf dem Remote-System zu etwas ausgeprägteren wie "prompt>", aber ein ähnliches Problem entsteht, die mir anzeigt, ist nicht der richtige Weg, um dies zu lösen.

Was ich denke könnte helfen, ist die Fähigkeit für das Skript zu sagen Erwarte, dass "Ich weiß, dass ich zu diesem Zeitpunkt richtig mit dem Remote-System synchronisiert bin, so den Eingabepuffer jetzt." Die expect Anweisung hat die -notransfer Markierung, die nicht den Eingangspuffer verwerfen, selbst wenn das Muster übereinstimmt, also denke ich, dass ich das Gegenteil von dem benötige.

Gibt es noch andere nützliche Techniken, mit denen ich die Remote-Shell vorhersehbarer verhalten kann? Ich verstehe, dass Expect eine Menge Arbeit durchläuft, um sicherzustellen, dass die erzeugte Sitzung erscheint, um mit dem Remote-System interaktiv zu sein, aber ich würde lieber einige der nervigeren interaktiven Funktionen (wie das horizontale Scrollen von ksh) ausgeschaltet sein.

Antwort

7

Wenn Sie weg alle Ausgaben werfen wollen Expect bisher gesehen hat, versuchen

expect -re $ 

Dies ist ein regexp Spiel auf $, die das Ende des Eingangspuffers bedeutet, so wird es einfach alles überspringen erhielt so weit. Weitere Details unter Expect man page.

+0

Ausgezeichnet, das scheint genau das zu sein, was ich brauchte. –

1

Sie könnten "set -o multiline" oder COLUMNS = 1000000 (oder einen anderen geeigneten großen Wert) versuchen.

+0

Die 'ksh' auf diesem System scheint nicht die 'Multiline'-Option zu haben, aber ich habe festgestellt, dass, wenn ich' o emacs' setze (die Emacs-Zeilenbearbeitungsoption ausgeschaltet wird, die die Standard hier), dann ist auch das horizontale Scrollen deaktiviert. –

0

Ich hatte Schwierigkeiten mit Ksh und Expect in der Vergangenheit. Meine Lösung war, etwas anderes als ksh für eine Login-Shell zu verwenden.

Wenn Sie die Remote-Anmeldung in eine andere als ksh ändern können (mit dem Befehl chsh oder Bearbeiten von/etc/passwd), können Sie dies mit/bin/sh als Shell versuchen.

Eine andere Alternative ist, KSH mitzuteilen, dass das Terminal ein "dummes" Terminal ist - erlauben Sie keine spezielle Verarbeitung.

$ export TERM="" 

könnte den Trick tun.

+0

Leider hängen in dieser Situation viele andere Dinge davon ab, dass die Shell ksh ist. Ich werde versuchen TERM zu deaktivieren, das ist eine gute Idee. –

Verwandte Themen