【问题标题】:Parsing iwlist scan using bash [closed]使用 bash 解析 iwlist 扫描 [关闭]
【发布时间】:2014-08-19 23:53:53
【问题描述】:

我需要在无线客户端 cpe 中运行自定义命令来获取以下数据

ESSID、MAC、频率、质量、电平、噪声。

XM.v5.5.8# iwlist ath0 scanning
ath0      Scan completed :
          Cell 01 - Address: DC:9F:DB:08:49:DE
                    ESSID:"Satek"
                    Mode:Master
                    Frequency:5.54 GHz (Channel 108)
                    Quality=28/94  Signal level=-68 dBm  Noise level=-92 dBm
                    Encryption key:on
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
                              36 Mb/s; 48 Mb/s; 54 Mb/s
                    Extra:bcn_int=100
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    Extra:mtik_ie=dd2a000c42000000011e0014000000661a05000041502d43454e54524f2d35000000000000000000

我尝试使用其他论坛的此代码

XM.v5.5.8# iwlist ath0 scanning | awk -F '[ :=]+' '/(ESS|Freq|Qual)/{ printf $3" " } /Encr/{ print $4 }'
"Satek" 5.54 28/94 on
"Satek" 5.57 14/94 on
"Satek" 5.6 13/94 on
"Satek" 5.61 9/94 on
"Satek" 5.64 36/94 on
"Satek" 5.68 26/94 on
"Satek" 5.7 9/94 on
"IVICA" 5.825 17/94 on

几乎所有我需要的东西,但我不知道如何获得其他项目,如 mac 地址信号电平和噪声。

【问题讨论】:

    标签: linux bash shell awk


    【解决方案1】:

    要解析所需值格式中的此类差异,您将需要 awk scriptbash script 以提供获取所有值所需的灵活性。 (你可以在一行中完成,但它会变得非常混乱)。这是一个 bash 脚本,它将解析 iwlist 并输出 mac essid frq chn qual lvl enc。我没有Noise,但如果你愿意,你可以简单地按照格式添加它。

    你想要的用法来自命令行。例如。 iwlist 'iface' scan | bash parseiwl.sh(其中 'iface'ath0parseiwl.sh 只是我保存脚本的名称)。 注意:由于使用了[[]]=~,此脚本不可移植,因此只能在bash 中使用:

    #!/bin/bash
    
    ## print header lines
    echo ""
    echo " mac                 essid         frq   chn qual   lvl  enc"
    
    while IFS= read -r line; do
    
        ## test line contenst and parse as required
        [[ "$line" =~ Address ]] && mac=${line##*ss: }
        [[ "$line" =~ \(Channel ]] && { chn=${line##*nel }; chn=${chn:0:$((${#chn}-1))}; }
        [[ "$line" =~ Frequen ]] && { frq=${line##*ncy:}; frq=${frq%% *}; }
        [[ "$line" =~ Quality ]] && { 
            qual=${line##*ity=}
            qual=${qual%% *}
            lvl=${line##*evel=}
            lvl=${lvl%% *}
        }
        [[ "$line" =~ Encrypt ]] && enc=${line##*key:}
        [[ "$line" =~ ESSID ]] && {
            essid=${line##*ID:}
            echo " $mac  $essid  $frq  $chn  $qual  $lvl  $enc"  # output after ESSID
        }
    
    done
    

    示例:

    sudo iwlist wlp23s0 scan | bash parseiwl.sh
    
    mac                 essid         frq   chn qual   lvl  enc
    00:14:D1:C6:C8:6F  "skyline_633"  2.442  7  54/70  -56  on
    

    【讨论】:

    • 干得好!您可以考虑将 printf 与包含宽度值的格式字符串(即%20s)一起使用,以确保即使内容长度不同,也能对齐。
    • 是的,您在printf 上是正确的。这有点快速原型,而不是精细格式化的成品。我不知道 OP 想要最终输出的顺序或格式,所以我只是间隔直到输出看起来合理:)
    • 会发生什么? codeXM.v5.5.8# ls dropbear_dss_host_key nscan.sh dropbear_rsa_host_key parseiwl.sh XM.v5.5.8# iwlist 'ath0' 扫描 | bash parseiwl.sh -sh: bash: 未找到code
    • 如果您已复制脚本并将其放在计算机上的parseiwl.sh 中,那么iwlist 'ath0' scan | bash parseiwl.sh 是正确的命令。如果错误是-sh: bash: not found,那就没有意义了。似乎是在说您在一行的某处(或在由多个; 分隔的行上)有一个流浪的-sh,它被解释为一个命令(bash 说 not found)。重新检查您的脚本副本并在第一行 #!/bin/bash 下添加行 set -x 以在运行脚本时输出调试信息。同时显示which bash的输出
    • 你没有运行 bash。 airOS 3.4(直到当前固件版本 5.4)是固件嵌入式操作系统AirOS 3.4。尝试在 bash 上运行脚本——这很好。你的问题是你没有 bash。在不知道您拥有什么外壳的情况下,完全猜测ubiquiti nanostation m5 上什么可行,什么不可行。
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多