首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCL -期望缓冲区削减第一行输出

TCL -期望缓冲区削减第一行输出
EN

Stack Overflow用户
提问于 2021-02-04 14:54:38
回答 2查看 359关注 0票数 1

.I制作了一个简单的TCL/expect脚本,通过regexp从我通常在无线访问控制器上运行的命令获取一些mac地址。

但我不明白的是,我总是错过来自缓冲区的第14-15行命令输出。

代码语言:javascript
复制
#!/usr/bin/expect
log_file -a -noappend wlac.log
#global spawn_id
set timeout 5
#set exp_internal 1
#exp_internal -f debug_wlac.log 1
match_max 700000 

set userf userfile
#username

set pwdf pwdfile
#password

set commands "sta-all"
#commands = display station all

set hostsls "wlac"
#hostsls= hostnames list

set f [open $userf]
set user [read $f]
close $f

set f [open $pwdf]
set password [read $f]
close $f 

set f [open "$hostsls"]
set hosts [split [read $f] "\n"]
close $f

set f [open "$commands"]
set commands [split [read $f] "\n"]
close $f

foreach host $hosts {
    if {[string trim $host] eq ""} then continue
    send_user "\n"
    send_user ">>>>>  Working on $host @ [exec date] <<<<<\n"
    send_user "\n"
    spawn ssh -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o AddKeysToAgent=yes "$user@$host"
    expect {
    "assword"
    {
    send "$password\n"
    }
    ">" 
    {
    send \n
    }
    }

    foreach cmd $commands {
    expect {
    ">"
    {
    append  maclist $expect_out(buffer)
    send "$cmd\n"
    }
    "More" 
    {
    append maclist $expect_out(buffer)
    send "\n"
    exp_continue 
    }
    }
    }
    }
    set pattern_mac {[0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}}
    set match_maclist [regexp -all -inline $pattern_mac $maclist]   
    puts "\n"
    puts "***Beginning of Output***"
    puts "\n"
    puts $maclist
    puts "\n"
    puts "***print array elements***"
    puts "\n"
    foreach i $match_maclist { puts $i }
    puts [llength $match_maclist]

    expect ">"
    send "quit\n"
    close
    wait
    send_user "\n"

我从日志中看到,我总是错过这个部分,也就是说,在命令"display“之后的前14行输出--所有其他输出缓冲区--都有我期望的所有内容。我试着启用调试日志,但没有注意到任何奇怪的地方。

代码语言:javascript
复制
<wlac-hostname>display station all
Rf/WLAN: Radio ID/WLAN ID                                                     
Rx/Tx: link receive rate/link transmit rate(Mbps)                             
---------------------------------------------------------------------------------------------------------------------------------------
STA MAC          AP ID AP name                       Rf/WLAN  Band  Type  Rx/Tx      RSSI  VLAN  IP address   SSID                                     
---------------------------------------------------------------------------------------------------------------------------------------
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name
aaaa-bbbb-cc11   1111  AP-HOSTNAME                   1/1      5G    11n   130/117    -55   1111  1.1.1.1      ssid-name

(ip、主机名和其他东西只是例子)

过了这点,一切都好了。我做了一次检查,但这并没有发生在“-”-更多的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-04 16:52:03

我怀疑expect输入缓冲区太小,这就是您拥有match_max 700000的原因。不幸的是,这没有任何效果,因为它适用于当前产生的进程,而目前没有这种进程。

您需要在开始时设置默认的大小,以便将来生成命令,方法是:

代码语言:javascript
复制
match_max -d 700000
票数 2
EN

Stack Overflow用户

发布于 2021-02-04 20:13:52

我建议,如果您的目标是获得MACs的列表,则不需要累积整个输出:

代码语言:javascript
复制
# ... initial stuff

set maclist {}

foreach host $hosts {
    if {[string trim $host] eq ""} then continue

    # using the builtin `timestamp` command
    send_user "\n>>>>>  Working on $host @ [timestamp -format %c] <<<<<\n\n"

    spawn ssh -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o AddKeysToAgent=yes "$user@$host"

    expect {
        "assword" { send "$password\n"; exp_continue }
        ">"
    }

    foreach cmd $commands {
        send "$cmd\r"
        expect {
            -re {\y[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}\y} {
                lappend maclist $expect_out(0,string)
                exp_continue 
            }
            "More" {
                send "\n"
                exp_continue 
            }
            ">" 
        }
    }
}

puts ""
puts "MAC list"
puts [join $maclist \n]

这意味着您不需要更改match_max。请从expect手册中了解这一点:

注意到过大的match_max值会减慢模式匹配器.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66048088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档