2010-11-24 6 views
1

Ich möchte in der Lage sein, einen langen Befehl zu erwarten, zu erwarten. Es ist irgendwie ein Mehrfachbefehl. Zunächst ist hier mein erwarten SkriptWie kann EXPECT interpretieren ein maskiertes Zeichen zu einem Befehlszeichen


#!/usr/bin/expect -f 
set timeout -1 
spawn telnet xxx.xxx.xxx.xxx 
expect "*?username:*" 
send "someusername\r" 
expect "*?assword:*" 
send "somepassword\r" 
# Here's the command I'd like to pass from the command prompt 
set command [lindex $argv 0] 
send "$command\r" 
send "exit\r" 

dann würde ich dieses Skript ausführen, wie so:

./expectscript "mkdir /usr/local/dir1\ncd /usr/local/dir1\ntouch testfile" 

Beachten Sie, dass ich „\ n“ setzen, um eine Eingabe zu initiieren, als ob ich das bin Verarbeitung bevor Sie zum nächsten wechseln.

Ich weiß, dass Sie die Befehle mit ";" trennen könnten, aber für diese spezielle Übung möchte ich in der Lage sein, das "\ n" mit einem "\ r" interpretieren zu können, so dass Sie sich wie erwartet verhalten würden obwohl es so war:

send "mkdir /usr/local/dir1\r" 
send "cd /usr/local/dir1\r" 
send "touch testfile\r" 

die Frage ist dann, wie die „\ n“ erwarten interpretieren „\ r“ zu sein? Ich habe versucht, das "\ r" in das Argument statt "\ n" zu setzen, aber das funktioniert nicht.

Danke für die Eingabe.

Antwort

3

Wenn ich ein einfaches Experiment zu tun, finde ich, dass die \n im Argument nicht durch meine Shell (bash) in eine neue Zeile umgewandelt wird; es bleibt ein Literal. Sie können dies selbst überprüfen, indem nur puts mit dem Kommandozeilenargument zu drucken, wie folgt aus:

puts [lindex $argv 0] 

um diese Arbeit erfordert ein wenig Arbeit Dinge zu teilen. Ach, Tcl's split Befehl tut nicht Split auf Multi-Zeichen-Sequenzen (es teilt sich auf viele verschiedene Zeichen auf einmal), so dass wir einen anderen Ansatz benötigen. Tcllib hat jedoch genau das, was wir brauchen: den Befehl splitx. Damit wir dies tun (basierend auf @ tensaix2j Antwort):

#!/usr/bin/expect -f 
package require Expect;     # Good practice to put this explicitly 
package require textutil::split; # Part of Tcllib 

# ... add your stuff here ... 
foreach line [textutil::split::splitx [lindex $argv 0] {\\n}] { 
    send "$line\r" 
    # Wait for response and/or prompt? 
} 
# ... add your stuff here ... 

Wenn Sie nicht tcllib installiert und konfiguriert für die Verwendung mit Erwarten können Sie snarf auch den Code für splitx direkt aus dem Code (finden Sie es online here), solange Sie die Lizenz, unter der es steht (Tcl-Lizenzierungsregeln), intern bestätigen.

+0

Beachten Sie, dass es für die Regexp '{\\ n}' ist, da wir einen Literal Backslash-n zuordnen möchten und das ist die Form, die die Anzahl der Backslashes minimiert, die Sie schreiben müssen, um das Literal nach Tcl's Analyse und der RE-Engine zu erhalten Parsing ... –

+0

Danke für den zusätzlichen Schritt, um Ihre Antwort im Detail zu erklären :) – EDJ

0
foreach cmd [ split $command \n ] { 
send "$cmd\r\n" 
} 
+0

Sie wollen fast sicher kein '\ n 'am Ende von jedem senden. –