为什么 expect-tcl 使用分号来 trim 输出?

Why does expect-tcl use the semicolon to trim the output?

我的脚本垃圾一块通过telnet从网络设备上进行配置,以便进一步修改。一些配置包含带有分号字符的编码数据。然而,以一种奇怪的方式,expect 在第一个分号字符之后切断输出,所有信息都进入日志。例如,配置包含以下几行,它们也在日志中:

 snmp-agent
 snmp-agent local-engineid 000007DB7F00000100000DBD
 snmp-agent community write cipher %@%@f:x6"^s,6.L~~BE~%c*0S6NH2@Y_W4I`NP6,W}VF'NN86NKSYoixJc$>;88sTj2yu2*/NTS6%@%@
 snmp-agent community read cipher %@%@]$OdG*7WdV@{aSD9vx"DH+]]*_[8D+2\u%7Ozr<,W3zP+]`HBK(\=oJuKL'IT|+w*3o4]iH+%@%@
 snmp-agent sys-info version v1 v2c
 undo snmp-agent sys-info version v3

我尝试了两种不同的方法,但结果没有改变:

1)

expect {
    "Error: Failed to authenticate." {exit}
    ">" {send "disp current-configuration | include snmp\r"}
}
expect "$device>" {
    set results [regexp -all -inline {[^\r\n]+} $expect_out(buffer)]
    puts "Length of output buffer is : [llength $results]"
    for {set i 1} {$i<[llength $results]-1} {incr i} {
        set confline [lindex $results $i]
        puts "$confline\[$i\] = $confline\r"
expect {
    "Error: Failed to authenticate." {exit}
    ">" {send "disp current-configuration | include snmp\r"}
}
expect "$device>" {
    set outfl [open "$SCROOT/$model-$device.out" w]
    puts $outfl $expect_out(buffer)
    flush $outfl
    close $outfl

这就是输出中发生的事情:

 snmp-agent
 snmp-agent local-engineid 000007DB7F00000100000DBD
 snmp-agent community write cipher %@%@f:x6"^s,6.L~~BE~%c*0S6NH2@Y_W4I`NP6,W}VF'NN86NKSYoixJc$>

谁知道如何解决这个问题?请帮我做一下。

UPD: 我扩展了匹配条件,得到了预期的结果。感谢 Colin Macleod 的提示。

您正在尝试读取下一个提示之前的所有数据,方法是

expect ">" {

但是输出数据包含一个“>”字符,所以 expect 在看到它时停止。只是巧合,下一个字符恰好是“;”。

您可以通过编写您的模式来解决此问题,仅当它是一行中的第一个 non-white-space 字符时才匹配“>”,例如

expect "\n\s*>" {