Инструменты пользователя

Инструменты сайта

Загрузка не удалась. Возможно, проблемы с правами доступа?

linux:wifi-stay-cmd

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

linux:wifi-stay-cmd [2017/10/24 19:18]
linux:wifi-stay-cmd [2021/02/11 09:21] (текущий)
Строка 1: Строка 1:
 +===== Linux: как получить состояние WiFi из командной строки =====
 +В лоб
 +<code bash>
 +iwlist wlan0 scan 
 +</​code>​
 +Более культурно:​
 +<code bash>
 +sudo apt-get install libmath-round-perl
 +</​code>​
 ++ скрипт:​
 +<code perl>
 +#​!/​usr/​bin/​perl
  
 +use strict;
 +use warnings;
 +use diagnostics;​
 +
 +use Math::​Round;​
 +
 +# Если число аргументов не равно единице
 +if (@ARGV != 1) {
 +        # Печатаем краткую справку
 +        print "​Usage:​\n";​
 +        print " ​ $0 ifname\n\n";​
 +        # Завершаем работу
 +        exit;
 +}
 +
 +# Будем использовать полученные данные для очистки экрана в дальнейшем
 +my $clear_screen = `clear`;
 +
 +
 +# Получаем имя интерфейса
 +my $ifname = shift;
 +
 +while (1) {
 +        # Сканируем эфир
 +        my $scan_result = `iwlist $ifname scan`;
 +        # Получаем код ошибки
 +        my $error_code = $?;
 +        # Завершаем работу если что-то не так
 +        exit if $error_code;​
 +        # Наскорую руку разбиваем результат сканирования на элементы
 +        my @scan_results_tmp = split /Cell \d+/is, $scan_result;​
 +        # Начинаем полноценный разбор
 +        my @scan_results = ();
 +        # Перебираем элементы
 +        foreach my $hotspot_line (@scan_results_tmp) {
 +                # Если нет номера канала значит это мусор, который надо пропустить
 +                next if $hotspot_line !~ m{Channel\:​}is;​
 +                # Строим элемент
 +                my %hotspot = ();
 +                # Номер канала
 +                $hotspot{'​Channel'​} = $hotspot_line;​
 +                $hotspot{'​Channel'​} =~ s{^.+Channel\:​(\d+).+$}{$1}is;​
 +                # SSID
 +                $hotspot{'​SSID'​} = $hotspot_line;​
 +                $hotspot{'​SSID'​} =~ s{^.+ESSID\:"​((.+?​)?​)"​.+$}{$1}is;​
 +                # Наличие шифрований
 +                $hotspot{'​Crypted'​} = $hotspot_line;​
 +                $hotspot{'​Crypted'​} =~ s{^.+Encryption key:​(\w+?​)\s.+$}{$1}is;​
 +                # Уровень сигнала. И сразу переводим его в проценты
 +                my $q1 = $hotspot_line;​
 +                $q1 =~ s{^.+Quality=(\d+)/​\d+.+$}{$1}is;​
 +                my $q2 = $hotspot_line;​
 +                $q2 =~ s{^.+Quality=\d+/​(\d+).+$}{$1}is;​
 +                $hotspot{'​Quality'​} = round($q1 * 100 / $q2);
 +                push @scan_results,​ \%hotspot;
 +        }
 +        # Сортируем
 +        @scan_results = sort { sprintf("​%02d",​ $a->​{Channel}) cmp sprintf("​%02d",​ $b->​{Channel}) } @scan_results;​
 +
 +        # Очищаем экран
 +        print $clear_screen;​
 +        # Печатаем данные
 +        print sprintf(" ​ % 2.2s [% 9.9s] [% 32.32s] [% 7.7s]\n",​ "​Ch",​ "​Quality",​ "​SSID",​ "​Crypt"​);​
 +        print sprintf('​%1$s'​x61 . "​\n",​ "​-"​);​
 +        foreach my $hotspot (@scan_results) {
 +                print sprintf(" ​ %02d [% 8d%%] [% 32.32s] [% 7.7s]\n",​
 +                        $hotspot->​{Channel},​
 +                        $hotspot->​{Quality},​
 +                        $hotspot->​{SSID},​
 +                        $hotspot->​{Crypted});​
 +        }
 +        # Делаем паузу
 +        sleep 1;
 +}
 +</​code>​
 +Рецепт отсюда:​ [[https://​www.ylsoftware.com/​news/​669]]