TCL Expect SCP进度脚本

TCL Expect SCP progress script

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

使用 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 ``\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
    }
}

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