在生成的 rsync 进程上使用等待会在 expect 中停止 rsync
Using wait on spawned rsync process stops rsync in expect
我有一个简单的 expect 脚本可以启动 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
问题是在我看到密码提示后 2 秒(可能是在 "invalid password" 块超时之后)rsync 崩溃了。它只是停止传输,甚至 Ctrl-C 也不能再杀死 expect 了。调试证明等待命令导致此行为。在我使用
之前
set timeout -1
expect eof
一切正常。但是那样我无法检索rsync的结果代码。
我的 expect 脚本是否有问题,或者这是 wait 命令或 rsync 中的错误?
您可以在 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
%
我有一个简单的 expect 脚本可以启动 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
问题是在我看到密码提示后 2 秒(可能是在 "invalid password" 块超时之后)rsync 崩溃了。它只是停止传输,甚至 Ctrl-C 也不能再杀死 expect 了。调试证明等待命令导致此行为。在我使用
之前set timeout -1
expect eof
一切正常。但是那样我无法检索rsync的结果代码。
我的 expect 脚本是否有问题,或者这是 wait 命令或 rsync 中的错误?
您可以在 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
%