我正在编写一个脚本,将TCL文件从服务器传输到远程系统。每个文件可能需要大约2个小时才能传输。我使用-re .
的原因是,在进程中,它将匹配任何内容并更新超时。因此,在10秒钟内,如果没有变化,那么它将结束脚本。到目前为止,我有这个脚本:
set timeout 10
expect {
-re ".*assword*." {
send "${password}rr"
exp_continue
} "lost connection" {
set success2 0
set success1 0
} "100%" {
puts "File Transfer successfuln"
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
使用expect -re .
,即使将此模式放在-re .
之前,也可能无法匹配-re ".*closed by remote host"
。你能expect
NN%
字符串吗?例如:
set timeout 60 ;# more timeout since you're scp'ing big files
expect {
-re ".*assword*." {
send "${password}r" ;# why do you use ``rr''?
exp_continue
} "lost connection" {
set success2 0
set success1 0
} "100%" {
puts "File Transfer successfuln"
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
部分。