2016-04-24 7 views
0

私はrsyncプロセスを開始し、パスワードを送信する簡単なexpectスクリプトを持っています。その後、私はrsyncのプロセスの結果コードをキャッチするためにウェイトを使用しています:spawnされたrsyncプロセスでwaitを使用すると、rsyncが予期して停止する

#!/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 

問題は、私は(おそらく「無効なパスワード」のブロックがタイムアウト後の)パスワードプロンプトのrsyncを参照してください2秒後ということですクラッシュします。それは単に送信を停止し、Ctrl-Cでさえもはや予想を殺すことはできません。デバッグすると、waitコマンドがこの動作を引き起こすことがわかります。使用する前に

set timeout -1 
expect eof 

すべてが正常に機能しました。しかし、その方法ではrsyncの結果コードを取得できませんでした。

expectスクリプトに問題がありますか?これはwaitコマンドまたはrsyncのバグですか?

答えて

1

expect eofの後にwaitとすることができます。例:

% 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

ありがとうございます!それがそれを解決しました。 – Werzi2001

関連する問題