TCL期待SCP进度脚本

时间:2015-03-18 18:17:42

标签: tcl expect scp

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

1 个答案:

答案 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}}部分。