2013-05-15 7 views
7

Ich schreibe ein Skript mit expect in dem ich rogin zu einem Host & danach muss ich einige Befehle senden. Jetzt möchte ich zu diesem Host zurückkehren und mich erneut an einen anderen Host anmelden und einige Befehle senden. Aber der Lauf meines Skripts wartet nicht darauf, dass der erste Host seine Jobs beendet und beendet, sondern sendet andere Befehle zwischen dem vorherigen Prozess. Wie kann ich dies erreichen mit expect bitte guide?Wie warten Sie, bis ein Prozess mit tcl-expect fertig ist

Beispielcode ist wie folgt:

#!/usr/local/bin/expect -f 

spawn rlogin host1 
expect "%" 
send "source xyz.csh\r" 
send "exit\r" 
expect "%" 

spawn rlogin host2 
some set of commands 

Antwort

0

Sie erarbeiten können

habe ich versucht, diese und es funktionierte.

spawn ssh host1 
expect ":" 
send pwd1 
expect "%" 
send "echo hi\r" 
expect "%" 
send "exit\r" 
expect eof 
spawn ssh host2  
expect ":" 
send pwd2 
7

Sie vergessen zu "drücken Sie die Eingabetaste". Nach dem Austritt senden, bis zum Ende der Weg für den Prozess warten os expect eof: „Senden Skript noch Rest der Befehle zwischen dem vorherigen Prozess“

send "source xyz.csh\r" 
expect "%" 
send "exit\r" 
expect eof 
+0

es ist schon da in meinem Code, ich habe vergessen, es hier in meinem Code zu erwähnen –

+0

, was schon da ist? das 'eof' oder das' \ r'? Bitte aktualisieren Sie Ihre Frage, um genauer zu sein. –

+0

erwarten eof funktioniert auch nicht. Skript weiterhin den Rest der Befehle zwischen dem vorherigen Prozess senden. –

1

dieses Konstrukt Versuchen Sie, wenn command zeitraubend:

. . . 
send "command\r" 

expect { 
    timeout { 
     puts "Running..." 
     exp_continue 
    } 
    "%PROMPT%" { 
     puts "Finished." 
    } 
} 

send "next command\r" 
. . . 

Auf timeout finden Sie continuosly für %PROMPT% mit exp_continue Befehl warten.

+0

Lebensretter Mann! Danke für diese Antwort! –

1

Ich fand diesen Beitrag, nachdem ich in einem Race-Condition-Problem lief: manchmal das Skript als erwartet und andere Male es nicht getan. Hinzufügen einer catch Anweisung an das Skript das gewünschte Ergebnis jedes Mal gewährleistete:

[...] 
expect eof 
catch wait result 
+0

fangen "einige letzte Zeile", hat erfolgreich eine Race-Condition für mich entfernt. Die Ausgabe von expect ist jetzt immer abgeschlossen. Statt nur manchmal. – user18099