2016-04-24 2 views
0

Ich habe ein einfaches expect-Skript, das einen rsync-Prozess startet und das Kennwort sendet. Danach bin ich mit Warten, um das Ergebnis Code des rsync-Prozess zu fangen:Verwenden der Wartezeit auf den erzeugten rsync-Prozess stoppt rsync in expect

#!/usr/bin/expect 

# check arguments 
if { $argc != 3 } { 
    puts "Usage $argv0 src dest password" 
    exit 1 
} 

# set arguments 
set src [lindex $argv 0] 
set dest [lindex $argv 1] 
set password [lindex $argv 2] 

# call rsync 
spawn rsync --delete --exclude=.svn -rvae ssh $src $dest 

# confirm connect question 
set timeout 2 
expect { 
    *connecting* {send "yes\r"} 
} 

# send password 
set timeout 5 
expect { 
    *assword: {send "$password\r"} 
} 

# invalid password 
set timeout 2 
expect { 
    *denied* {exit 2} 
} 

# get process result 
lassign [wait] pid spawnid os_error_flag value 

# exit with error code 
exit $value 

Das Problem ist, dass 2 Sekunden nachdem ich das Passwort-Eingabeaufforderung (wahrscheinlich nach dem „ungültig Kennwort“ Blockzeiten out) rsync sehen stürzt ab. Es hört einfach auf zu senden und selbst Ctrl-C kann das nicht mehr erwarten. Das Debugging beweist, dass der Befehl wait dieses Verhalten verursacht. Bevor ich benutzte

set timeout -1 
expect eof 

und alles hat gut funktioniert. Aber so konnte ich den Ergebniscode von rsync nicht abrufen.

Gibt es ein Problem in meinem expect-Skript oder ist das ein Fehler im Befehl wait oder rsync?

Antwort

1

Sie können wait nach expect eof. Zum Beispiel:

% cat foo.exp 
spawn sh -c "exit 17" 
expect eof 
set waitResult [wait] 
send_user $waitResult\n 
% expect foo.exp 
spawn sh -c exit 17 
29293 exp7 0 17 
% 
+0

Vielen Dank! Das hat es gelöst. – Werzi2001