我正在编写一个脚本来将TCL文件从服务器传输到远程系统。每个文件可能需要约2个小时才能传输。我使用-re .
的原因是在进行过程中它将匹配任何内容并更新超时。所以在10秒内,如果没有变化,那么它将结束脚本。到目前为止,我有这个脚本:
set timeout 10
expect {
-re ".*assword*." {
send "${password}\r\r"
exp_continue
} "lost connection" {
set success2 0
set success1 0
} "100%" {
puts "File Transfer successful\n"
set success1 0.5
exp_continue
} -re . {
exp_continue
} timeout {
set success2 0
set success1 0
} -re ".*closed by remote host" {
set success2 0.5
}
}
# IF success1 + success2 = 1, then the transfer was successful.
问题是这只会有效。文件传输100%后,我必须等待消息Connection close by remote host
才能继续执行脚本。我相信-re .
在此之前匹配并结束脚本。此消息显示的时间各不相同。因此我得到的消息无法找到变量success2
答案 0 :(得分:3)
使用expect -re .
即使您将此模式放在-re ".*closed by remote host"
之前,也可能无法与-re .
匹配。你可以expect
NN%
字符串吗?例如:
set timeout 60 ;# more timeout since you're scp'ing big files
expect {
-re ".*assword*." {
send "${password}\r" ;# why do you use ``\r\r''?
exp_continue
} "lost connection" {
set success2 0
set success1 0
} "100%" {
puts "File Transfer successful\n"
set success1 0.5
exp_continue
} -re {[0-9]{1,2}%} {
exp_continue
} timeout {
set success2 0
set success1 0
} -re ".*closed by remote host" {
set success2 0.5
} eof {
set success2 0.5
}
}
我不确定你是spawn
scp
scp
。我的closed by remote host
不会输出-re ".*closed by remote host"
消息。可能eof
部分不是必需的,因此您可以保留{{1}}部分。