我很期待。尝试为cisco路由器编写脚本,将接口列表作为输入,遍历每个接口,运行命令,保存输出,计算输出中的行数,并根据计数执行if / else语句。
我已经在论坛上进行了搜索,并根据其他用户的建议拼凑了以下脚本:
现在暂时粘贴循环代码:
foreach int $interfaces {
match_max 20000
send_user "\n"
send_user "====== Checking $int ======\n"
send_user "\n"
set capture [open output2 w]
expect "#"
send "show policy-map $int out\n"
sleep 1
expect "#"
set output $expect_out(buffer)
puts $capture $output
close $capture
set capture 0
send_user "\n\n---------- $expect_out(buffer) ------------\n\n"
set count 0
set count [exec cat output2 | wc -l]
send_user "\n=========== $int $count ===========\n"
if {$count<3} {
puts "Service policy on ! $ip ! $int ! is not working"
} else {
puts "Service policy on ! $ip ! $int is working"
}
exec echo > output2
}
但是,当我运行脚本时,文件output2和expect_out(缓冲区)总是只有一个字符&#39;#&#39;。所以我没有得到所需的结果。出于某种原因,expect_out(缓冲区)不能捕获命令的输出&quot; show policy-map $ int out&#39;并将其写入文件。我猜这里有一个基本的编码错误,就循环结构而言。
非常感谢帮助!
非常感谢。
答案 0 :(得分:0)
首先,请阅读本书以期待学习:Exploring Expect
从上面的书:
所有匹配的字符加上之前出现的字符 但是不匹配存储在名为expect_out(buffer)的变量中。
在这种情况下,它只是你期望的模式,它是#
。所以你看对了。
现在,根据您的要求,请参阅How to access the result of a remote command in Expect。此链接为您提供必要的解释。
答案 1 :(得分:0)
再次感谢您的支持。我发现了这个问题。在我感兴趣的那个之前有一个'#'。更改模式匹配,现在它可以工作。