Использование Perl для форматирования вывода nmcli и получения имен WiFi - PullRequest
2 голосов
/ 01 апреля 2020

Я хочу получить список доступных Wi-Fi через nmcli и вернуть вывод в формате JSON.
В настоящее время я написал это:

use JSON;

sub get_available_wifi_list {

    ### rescan for wifi 
    system('nmcli device wifi rescan');

    # get the list of wifi's
    my $nmcli_output= `nmcli device wifi`;

    # every line into array
    my @wifi_list = split /\n/, $nmcli_output;

    ### remove first line
    shift(@wifi_list);

    # pack into json 
    my $data_ref = \@wifi_list;
    my $json = to_json($data_ref);  

    return $json;
}

Необработанный вывод nmcli device wifi:

IN-USE  SSID                MODE   CHAN  RATE        SIGNAL  BARS  SECURITY 
*       WLAN-123            Infra  11    130 Mbit/s  60      ▂▄▆_  WPA2     
        FRITZ!Box 7430 JW   Infra  1     195 Mbit/s  57      ▂▄▆_  WPA2     
        Telekom_FON         Infra  11    130 Mbit/s  47      ▂▄__  --       
        WLAN-123ABC         Infra  6     270 Mbit/s  32      ▂▄__  WPA2     
        WiFi-Repeater       Infra  1     135 Mbit/s  24      ▂___  WPA2  

SSID может содержать пробелы, что также может быть проблемой. Мне нужен массив с ha sh для каждого Wi-Fi со всей статистикой в ​​качестве пар ключ-значение. Примерно так:

@wifi_list = (
    { 
         SSID = 'WLAN-123',
         MODE = 'Infra',
         SIGNAL = 60,
         SECURITY = 'WPA2'
     },
     {
         SSID = 'FRITZ!BOX 7430 JW',
         MODE = 'Infra',
         SIGNAL = 60,
         SECURITY = 'WPA2'
      }, ...
);

Возможно, другие решения для получения имен и статистики WiFi будут работать лучше, но я хочу подключиться к одному из указанных Wi-Fi позже, поэтому я использую nmcli.
Спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

nmcli уже имеет функции, которые помогут вам сделать это. Вы можете получить выходные данные в других форматах:

$ nmcli -m multiline device wifi
IN-USE:                                 *
SSID:                                   Home Wifi
MODE:                                   Infra
CHAN:                                   48
RATE:                                   270 Mbit/s
SIGNAL:                                 75
BARS:                                   ▂▄▆_
SECURITY:                               WPA2

Еще лучше краткий вывод, который теперь представляет собой просто строку, разделенную двоеточиями:

$ nmcli --terse  device wifi
*:Home Wifi:Infra:48:270 Mbit/s:76:▂▄▆_:WPA2

Вы даже можете сказать nmcli какие поля вы хотите:

$ nmcli --get-values ssid,mode  device wifi
Home Wifi:Infra
0 голосов
/ 01 апреля 2020

Пожалуйста, посмотрите, выполняет ли следующий фрагмент кода то, что вы ищете

Примечание: хотя JSON вообще не задействовано - данные хранятся в ха sh

use strict;
use warnings;
use feature 'say';

use utf8;
use Data::Dumper;

binmode STDOUT, ':utf8';

my @wifi;
my @fields = split ' ', <DATA>;

while( <DATA> ) {
    my %hash;
    my @array = unpack('A8A20A7A6A12A8A6A8',$_);
    push @wifi, \%hash;
}

say Dumper(\@wifi);

__DATA__
IN-USE  SSID                MODE   CHAN  RATE        SIGNAL  BARS  SECURITY 
*       WLAN-123            Infra  11    130 Mbit/s  60      ▂▄▆_  WPA2     
        FRITZ!Box 7430 JW   Infra  1     195 Mbit/s  57      ▂▄▆_  WPA2     
        Telekom_FON         Infra  11    130 Mbit/s  47      ▂▄__  --       
        WLAN-123ABC         Infra  6     270 Mbit/s  32      ▂▄__  WPA2     
        WiFi-Repeater       Infra  1     135 Mbit/s  24      ▂___  WPA2  

Вывод

$VAR1 = [
          {
            'RATE' => '130 Mbit/s',
            'SSID' => 'WLAN-123',
            'BARS' => "\x{2582}\x{2584}\x{2586}_",
            'CHAN' => '11',
            'MODE' => 'Infra',
            'SIGNAL' => '60',
            'SECURITY' => 'WPA2',
            'IN-USE' => '*'
          },
          {
            'CHAN' => '1',
            'MODE' => 'Infra',
            'BARS' => "\x{2582}\x{2584}\x{2586}_",
            'RATE' => '195 Mbit/s',
            'SSID' => 'FRITZ!Box 7430 JW',
            'IN-USE' => '',
            'SECURITY' => 'WPA2',
            'SIGNAL' => '57'
          },
          {
            'RATE' => '130 Mbit/s',
            'SSID' => 'Telekom_FON',
            'BARS' => "\x{2582}\x{2584}__",
            'MODE' => 'Infra',
            'CHAN' => '11',
            'IN-USE' => '',
            'SIGNAL' => '47',
            'SECURITY' => '--'
          },
          {
            'CHAN' => '6',
            'MODE' => 'Infra',
            'RATE' => '270 Mbit/s',
            'SSID' => 'WLAN-123ABC',
            'BARS' => "\x{2582}\x{2584}__",
            'IN-USE' => '',
            'SECURITY' => 'WPA2',
            'SIGNAL' => '32'
          },
          {
            'SIGNAL' => '24',
            'SECURITY' => 'WPA2',
            'IN-USE' => '',
            'BARS' => "\x{2582}___",
            'RATE' => '135 Mbit/s',
            'SSID' => 'WiFi-Repeater',
            'MODE' => 'Infra',
            'CHAN' => '1'
          }
        ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...