为什么 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*>" {
我的脚本垃圾一块通过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*>" {