TCL Expect SCP进度脚本



我正在编写一个脚本,将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
    }
}

我不知道你的spawnscp怎么样。我的scp不输出closed by remote host消息。也许-re ".*closed by remote host"部分没有必要,所以你可以保留eof部分。

最新更新