Вопрос или проблема
Я пытаюсь создать скрипт, чтобы позволить пользователю выбрать из доступных сетей, используя:
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 доступных сетей предоставляет мощный инструмент для управления сетевыми подключениями через командную строку. Это позволяет значительно упростить управление сетью и автоматизировать подключение в различных сценариях, что особенно актуально в корпоративной среде. Обязательно выполняйте тестирование и отладку полученных скриптов в безопасной среде, чтобы убедиться в корректности работы.