expect loop / expect_out(buffer)问题

时间:2014-07-10 12:14:04

标签: for-loop expect

我很期待。尝试为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;并将其写入文件。我猜这里有一个基本的编码错误,就循环结构而言。

非常感谢帮助!

非常感谢。

2 个答案:

答案 0 :(得分:0)

首先,请阅读本书以期待学习:Exploring Expect

从上面的书:

  

所有匹配的字符加上之前出现的字符   但是不匹配存储在名为expect_out(buffer)的变量中。

在这种情况下,它只是你期望的模式,它是#。所以你看对了。

现在,根据您的要求,请参阅How to access the result of a remote command in Expect。此链接为您提供必要的解释。

答案 1 :(得分:0)

再次感谢您的支持。我发现了这个问题。在我感兴趣的那个之前有一个'#'。更改模式匹配,现在它可以工作。