TCL Expect SCP进度脚本

TCL Expect SCP进度脚本,tcl,expect,scp,Tcl,Expect,Scp,我正在编写一个脚本,将TCL文件从服务器传输到远程系统。传输每个文件可能需要约2小时。我之所以使用-re.,是为了在进程中匹配任何内容并更新超时。因此,在10秒钟内,如果没有变化,那么它将结束脚本。到目前为止,我有以下脚本: set timeout 10 expect { -re ".*assword*." { send "${password}\r\r" exp_continue } "lost connection" { set

我正在编写一个脚本,将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%传输后,我必须等待消息
远程主机关闭连接
,然后才能继续脚本。我相信
-re.
匹配了前面的内容,并结束了脚本。显示此消息所需的时间各不相同。因此,我收到消息,无法使用
expect-re找到变量success2

即使将此模式置于
-re.
之前,您也可能无法匹配
-re.“*由远程主机关闭”。你能期待
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
ing
scp
的。My
scp
不输出由远程主机关闭的
消息。也许
-re.“*由远程主机关闭”
部分不是必需的,因此您可以只保留
eof
部分。

使用
expect-re.
您可能无法匹配
-re.“*由远程主机关闭”
即使您将此模式放在
-re.
之前。你能期待
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
ing
scp
的。My
scp
不输出由远程主机关闭的
消息。也许
-re.“*由远程主机关闭”
部分不是必需的,因此您可以只保留
eof
部分。

使用
expect-re.
您可能无法匹配
-re.“*由远程主机关闭”
即使您将此模式放在
-re.
之前。你能期待
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
ing
scp
的。My
scp
不输出由远程主机关闭的
消息。也许
-re.“*由远程主机关闭”
部分不是必需的,因此您可以只保留
eof
部分。

使用
expect-re.
您可能无法匹配
-re.“*由远程主机关闭”
即使您将此模式放在
-re.
之前。你能期待
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
ing
scp
的。My
scp
不输出由远程主机关闭的
消息。可能不需要
-re.“*由远程主机关闭”
部分,因此您可以只保留
eof
部分。

-re.
尝试并运行两次之前,尝试将该模式移到模式列表的更高位置。第一次工作,第二次失败。打开expect的调试,看看它在做什么:在
expect
命令之前添加此命令:
exp_internal 1
当我用该代码调试它时,它似乎工作得很好。它以有序的方式进行评估。我要再运行几次,看看它是否会坏,是否会再次坏。它似乎适用于较小的文件,但会因较大的文件而中断。有没有其他方法来实现这个过程?在
-re.
尝试并运行两次之前,尝试将该模式移到模式列表的更高位置。第一次工作,第二次失败。打开expect的调试,看看它在做什么:在
expect
命令之前添加此命令:
exp_internal 1
当我用该代码调试它时,它似乎工作得很好。它以有序的方式进行评估。我要再运行几次,看看它是否会坏,是否会再次坏。它似乎适用于较小的文件,但会因较大的文件而中断。有没有其他方法来实现这个过程?在
-re.
尝试并运行两次之前,尝试将该模式移到模式列表的更高位置。第一次工作,第二次失败。打开expect的调试,看看它在做什么:在
expect
命令之前添加此命令:
exp_internal 1
当我用该代码调试它时,它似乎工作得很好。它以有序的方式进行评估。我要再运行几次,看看它是否会坏,是否会再次坏。它似乎适用于较小的文件,但会因较大的文件而中断。有没有其他方法来实现这个过程?在
-re.
尝试并运行两次之前,尝试将该模式移到模式列表的更高位置。第一次工作,第二次失败。打开expect的调试,看看它在做什么:在
expect
命令之前添加此命令:
exp_internal 1
当我用该代码调试它时,它似乎工作得很好。它以有序的方式进行评估。我要再运行几次,看看它是否会坏,是否会再次坏。它似乎适用于较小的文件,但会因较大的文件而中断。有没有其他方法来实施这个过程?这个方法真是太棒了!expect有一个小警告:
expect:“|***************************************************************************************139 KB 10:17 ETA”(spawn_id exp10)是否匹配正则表达式“.*assword*”?大门“*asswor*”?门=否“*被远程主机关闭”?门“*被远程主机关闭”?门=没有“100%”?没有“失去联系”?没有“[0-9]{1,2}%”?门“*%”?门=否
。有时它看不到%,因此它不会遇到可能表明
**…**
部件未与
NN%
同时打印(例如通过
printf
)的条件。但我认为这仍然有效。你是说我的工作环境有时不起作用吗?它确实起作用。这只是一种想法,如果它在那种状态下停留更长时间,它可能仍然会破裂