Как я могу извлечь SSID доступных сетей, используя команду nmcli?

Вопрос или проблема

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

nmcli device wifi

показывает 2 сети (например, в текущем местоположении):

введите описание изображения здесь

Как я могу извлечь только имя (SSID) доступных сетей?

Программа nmcli предоставляет тонкий контроль над своим выводом через опцию командной строки -f или --fields.

Например, nmcli -f SSID device wifi или nmcli --fields SSID device wifi выведет только значения поля SSID для всех доступных сетей.

Если вы обрабатываете вывод в скрипте, вам может понадобиться опция -t (--terse), которая убирает заголовок, и опция -m (--mode), которая предоставляет вывод в формате ключ:значение.

Если вы хотите получить список сетей, которые вы сохранили (а не сети, которые ваше устройство в данный момент может видеть), вы можете использовать команду

nmcli connection show

NAME                UUID                                  TYPE      DEVICE
preconfigured       01010101-bb67-4cc4-af22-f958954d6159  wifi      wlan0    
lo                  02020202-b988-4e28-b9fc-f7a744456130  loopback  lo
home-sweet          03030303-2df7-4083-b8ae-f9302a97cbcc  wifi      --
Wired connection 1  04040404-c9b2-32ee-8a05-924eb03d2b9c  ethernet  --

Но, к сожалению, это не включает фактический SSID подключения, если только в вышеупомянутом случае (home-sweet) мы не назвали подключение так же, как SSID.

Получить SSID немного сложно, но я написал однострочник для этого.

nmcli -t -f name,type c | sed -nE "s/(.*)\:.*wireless/\1/p" | xargs -I {} nmcli -f 802-11-wireless.ssid c show {} | sed -nE "s/.*\s+(.*)/\1/p"

Позвольте мне разбить это на 4 отдельные команды

nmcli -t -f name,type c

preconfigured:802-11-wireless
lo:loopback
home-sweet:802-11-wireless
Wired connection 1:802-3-ethernet

Это получает список имен и типов подключений и направляет их в…

sed -nE "s/(.*)\:.*wireless/\1/p"

Который находит любые строки, содержащие слово wireless, и захватывает текст перед первым :; затем он берет 1-ю захваченную группу и направляет её в…

xargs -I {} nmcli -f 802-11-wireless.ssid c show {} 

Который берет вывод выше и передает параметры в команду nmcli, запрашивая её показать детали захвата, в частности поле 802-11-wireless.ssid

Затем я, наконец, направляю это в другую команду sed, чтобы извлечь значение из возвращенной строки

sed -nE "s/.*\s+(.*)/\1/p"

Который просто возвращает список сохраненных подключений Wi-Fi, только с SSID

Ответ или решение

Для извлечения SSID доступных сетей с использованием команды nmcli в Linux, можно воспользоваться несколькими подходами, которые позволяют не только эффективно управлять сетями, но и осуществлять скриптование для автоматизации процессов. Давайте подробно рассмотрим, как это сделать и для чего это может быть полезно.

Теория

Команда nmcli (NetworkManager Command Line Interface) предоставляет возможность управлять сетевыми соединениями через командную строку. Функционал этой утилиты охватывает мониторинг соединения, его настройку, а также получение информации о доступных сетях Wi-Fi.

Опция -f (или --fields) позволяет вам указать, какие именно поля вас интересуют. Параметр SSID отвечает за отображение только имен доступных Wi-Fi сетей. Это полезно, если вам нужно предоставить пользователю возможность выбора из списка доступных сетей.

Также важно обратить внимание на опции -t (--terse) и -m (--mode). Опция -t убирает заголовки из вывода, что удобно для скриптования, когда нужно работать только с чистыми данными без вспомогательной информации. Опция -m позволяет получить вывод в формате ключ:значение, который тоже может быть полезен для более детального анализа или в специфичных случаях.

Пример

Чтобы извлечь только SSID доступных вам в данный момент сетей, выполните следующую команду:

nmcli -f SSID device wifi 

Это отобразит список только значений SSID доступных Wi-Fi сетей. Чтобы сделать вывод более удобным для последующей обработки, уберите заголовки:

nmcli -t -f SSID device wifi

Если же вам требуется работать со списком известных вам сетей, то nmcli также предоставляет возможность получить информацию о ранее сохранённых соединениях. Но стоит учесть, что получаемый список не всегда может быть полным, поскольку названия в нём не всегда совпадают с фактическими SSID сетей. Если вас интересует именно сохранённые сети, используйте команду:

nmcli connection show

Применение

Полученные данные можно использовать в скриптах для автоматизации подключения к сети. Например, можно написать скрипт на Bash, который предложит пользователю выбрать сеть из списка и автоматически подключиться к выбранной сети. Это особенно полезно в сценариях, где требуется автоматическое подключение к различным Wi-Fi в условиях меняющейся среды, например, для мобильных рабочих станций или в больших офисах с множеством точек доступа.

Скрипт Пример:

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

#!/bin/bash

# Получаем список SSID
ssids=$(nmcli -t -f SSID device wifi | grep -v '^$' | nl)

echo "Доступные сети Wi-Fi:"
echo "$ssids"

# Запрос на выбор сети
echo -n "Введите номер сети для подключения: "
read number

# Извлечение ssid по номеру
ssid=$(echo "$ssids" | grep -w "^$number" | awk '{print $2}')

if [ -z "$ssid" ]; then
  echo "Неверный выбор, попробуйте снова."
  exit 1
fi

# Попытка подключения
nmcli device wifi connect "$ssid"

Заключение

Использование nmcli для извлечения SSID доступных сетей предоставляет мощный инструмент для управления сетевыми подключениями через командную строку. Это позволяет значительно упростить управление сетью и автоматизировать подключение в различных сценариях, что особенно актуально в корпоративной среде. Обязательно выполняйте тестирование и отладку полученных скриптов в безопасной среде, чтобы убедиться в корректности работы.

Оцените материал
Добавить комментарий

Капча загружается...