- Вопрос или проблема
- Ответ или решение
- Завершение процесса wpa_supplicant при обнаружении неверного пароля
- 1. Понимание поведения wpa_supplicant
- 2. Использование командной строки и инструментов для мониторинга
- Пример скрипта
- 3. Использование wpa_cli вместо wpa_supplicant
- Пример использования wpa_cli
- Заключение
Вопрос или проблема
Обычно, когда я запускаю wpa_supplicant
, я получаю такой вывод:
Успешно инициализирован wpa_supplicant
ioctl[SIOCSIWAP]: Операция не разрешена
ioctl[SIOCSIWENCODEEXT]: Неверный аргумент
ioctl[SIOCSIWENCODEEXT]: Неверный аргумент
wlan3: Попытка ассоциации с 9c:3d:cf:fb:95:96 (SSID='Bell420' freq=2462 MHz)
wlan3: Запрос ассоциации к драйверу не удался
wlan3: Ассоциирован с 9c:3d:cf:fb:95:96
wlan3: Аутентификация с 9c:3d:cf:fb:95:96 истекла.
ioctl[SIOCSIWAP]: Операция не разрешена
wlan3: CTRL-EVENT-DISCONNECTED bssid=9c:3d:cf:fb:95:96 причина=3 локально_сгенерировано=1
wlan3: WPA: 4-Way Handshake не удался - возможно, неправильный предварительно разделяемый ключ
Проблема в том, что он просто продолжает пытаться снова и снова.
Есть ли способ сказать wpa_supplicant
, чтобы он завершился, как только получит явную ошибку, такую как неправильный ключ?
Я на старом встраиваемом устройстве с wpa_supplicant v2.1
.
Я написал временное решение для мониторинга wpa_supplicant
на наличие неправильных ключей. Используя grep
на wpa_supplicant
(с stdbuf
на основе комментария Стефана Шазеласa здесь):
# Создать файл конфигурации с ssid и паролем
wpa_passphrase "$ssid" "$password" > /etc/wpa_supplicant/wpa_supplicant.conf
# Если ключ WiFi неправильный, убить подсhell
subshell=$BASHPID
(sudo stdbuf -o0 wpa_supplicant -Dwext -iwlan1 -c/etc/wpa_supplicant/wpa_supplicant.conf 2>&1 \
| grep -m 1 "предварительно разделяемый ключ может быть неверным" \
&& kill -s PIPE "$subshell") &
Примечание: указанный блок находится внутри подсhell в скрипте.
Сначала это, казалось, работало, но со временем я заметил, что иногда это приводило к сбоям всего скрипта, когда пароль был правильным. В другие разы это работало как ожидалось.
Должен быть лучший способ сделать это.
Редактировать: Может быть, я должен использовать wpa_cli
вместо этого?
#!/bin/bash
# SSID и пароль
ssid="ВашSSID"
password="ВашПароль"
# Создать wpa_supplicant.conf
wpa_passphrase "$ssid" "$password" > /etc/wpa_supplicant/wpa_supplicant.conf
# Запустить wpa_supplicant в фоновом режиме
wpa_supplicant -Dwext -iwlan1 -c/etc/wpa_supplicant/wpa_supplicant.conf > /tmp/wpa_supplicant.log 2>&1 &
# Мониторинг файла журнала на наличие сообщений об ошибках
tail -f /tmp/wpa_supplicant.log | while read -r line; do
if [[ $line == *"предварительно разделяемый ключ может быть неверным"* ]]; then
echo "Обнаружен неверный ключ. Завершение..."
kill $!
fi
done
wpa_supplicant
запускается в фоновом режиме, а его вывод перенаправляется в файл журнала. Команда tail
непрерывно считывает файл журнала и проверяет наличие указанного сообщения об ошибке. Если сообщение об ошибке найдено, оно выводит сообщение и завершает скрипт, уничтожая процесс wpa_supplicant
.
Ответ или решение
Завершение процесса wpa_supplicant при обнаружении неверного пароля
При использовании wpa_supplicant
для подключения к беспроводным сетям, часто возникает ситуация, когда программа не может успешно пройти аутентификацию при неверном пароле. Это может привести к постоянным попыткам соединения, что, безусловно, является нежелательным поведением. В данном ответе мы рассмотрим методы, которые помогут автоматически завершать процесс wpa_supplicant
, если программа обнаруживает ошибку аутентификации, такую как неверный предустановленный ключ (PSK).
1. Понимание поведения wpa_supplicant
При запуске wpa_supplicant
, он будет продолжать попытки аутентификации, даже если с указанным паролем возникли проблемы. К сожалению, стандартная версия wpa_supplicant v2.1
, как в вашем случае, не предоставляет встроенной опции для автоматической остановки при обнаружении определенных ошибок.
2. Использование командной строки и инструментов для мониторинга
Существуют различные способы, как можно реализовать автоматическое завершение процесса. Один из наиболее распространенных подходов — использование команд таких, как grep
и tail
, для мониторинга выходных данных wpa_supplicant
в режиме реального времени.
Пример скрипта
Вот пример скрипта, который включает в себя механизм автоматического завершения процесса wpa_supplicant
при обнаружении неверного пароля:
#!/bin/bash
# Указать SSID и пароль
ssid="ВашSSID"
password="ВашПароль"
# Создать конфигурационный файл wpa_supplicant
wpa_passphrase "$ssid" "$password" > /etc/wpa_supplicant/wpa_supplicant.conf
# Запустить wpa_supplicant в фоновом режиме
wpa_supplicant -Dwext -iwlan1 -c/etc/wpa_supplicant/wpa_supplicant.conf > /tmp/wpa_supplicant.log 2>&1 &
# Мониторить лог-файл на наличие сообщений об ошибках
tail -f /tmp/wpa_supplicant.log | while read -r line; do
if [[ $line == *"pre-shared key may be incorrect"* ]]; then
echo "Обнаружен неправильный ключ. Выход..."
kill $! # Завершение процесса wpa_supplicant
break
fi
done
3. Использование wpa_cli вместо wpa_supplicant
Помимо применения tail
и grep
, вы также можете рассмотреть возможность использования wpa_cli
. Этот инструмент предоставляет интерфейс командной строки для взаимодействия с wpa_supplicant
, позволяя вам лучше отслеживать события и управлять подключениями. С помощью wpa_cli
вы можете настроить скрипт, который будет ждать событий и выполнить соответствующие действия, включая завершение процесса при возникновении ошибки аутентификации.
Пример использования wpa_cli
Вы можете использовать wpa_cli
в цикле для обращения к статусу соединения и проверки ошибок:
#!/bin/bash
# Настройка SSID и пароля
ssid="ВашSSID"
password="ВашПароль"
# Создание конфигурационного файла
wpa_passphrase "$ssid" "$password" > /etc/wpa_supplicant/wpa_supplicant.conf
# Запуск wpa_supplicant
wpa_supplicant -Dwext -iwlan1 -c/etc/wpa_supplicant/wpa_supplicant.conf &
# Ожидание и проверка состояния через wpa_cli
while true; do
status=$(wpa_cli status | grep "wpa_state")
if [[ $status == *"DISCONNECTED"* ]]; then
# Проверка дополнительного статуса
if wpa_cli status | grep -q "pre-shared key may be incorrect"; then
echo "Неправильный ключ. Завершение работы..."
kill $! # Завершение процесса wpa_supplicant
break
fi
fi
sleep 2
done
Заключение
Методы, описанные выше, предлагают разнообразные решения для завершения процесса wpa_supplicant
в случае неверного пароля. Выбор метода зависит от ваших конкретных потребностей и окружения. Использование wpa_cli
и логирование ошибок через tail
и grep
позволяют гибко реагировать на состояние подключения, предотвращая бесконечные попытки аутентификации и оптимизируя рабочие процессы при установлении соединения с Wi-Fi.