![wpa_supplicant - определяет, что мой пароль неверный?](https://rvso.com/image/1447604/wpa_supplicant%20-%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8F%D0%B5%D1%82%2C%20%D1%87%D1%82%D0%BE%20%D0%BC%D0%BE%D0%B9%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%20%D0%BD%D0%B5%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B9%3F.png)
Если я укажу неверный пароль при подключении к сети WiFi, есть ли способ определить, что причиной того, что я не могу подключиться, является неверный пароль (а не одна из многих других возможных причин, по которым невозможно подключиться)?
Например, здесь я добавляю сеть, но намеренно указываю неправильный пароль. Если я проверяю статус, то вижу, что этоSCANNING
# wpa_cli add_network
Selected interface 'wlan0'
1
# wpa_cli set_network 1 ssid \"MyPlace\"
Selected interface 'wlan0'
OK
# wpa_cli set_network 1 psk \"SuperSecret\"
Selected interface 'wlan0'
OK
# wpa_cli select_network 1
Selected interface 'wlan0'
OK
# wpa_cli status
Selected interface 'wlan0'
wpa_state=SCANNING
p2p_device_address=fe:c2:de:37:93:11
address=fc:c2:de:37:93:11
Если я напишу скрипт, который будет запускаться wpa_cli status
повторно после выбора сети, я увижу, что он проходит через следующие фазы:
SCANNING
ASSOCIATING
4WAY_HANDSHAKE
DISCONNECTED
SCANNING
Так есть ли способ обнаружить, что фаза ассоциации/рукопожатия не удалась из-за неправильного пароля? Например, сообщает ли событие отключения о какой-то причине, которая сохраняется и которую я затем могу запросить?
решение1
Если мы посмотрим наwpa_supplicant/events.c:2326
мы видим:
if (could_be_psk_mismatch(wpa_s, reason_code, locally_generated)) {
wpa_msg(wpa_s, MSG_INFO, "WPA: 4-Way Handshake failed - "
"pre-shared key may be incorrect");
if (wpas_p2p_4way_hs_failed(wpa_s) > 0)
return; /* P2P group removed */
wpas_auth_failed(wpa_s, "WRONG_KEY");
}
Поэтому, когда эта логика срабатывает, она регистрируется WPA: 4-Way Handshake failed - pre-shared key may be incorrect
.
Затем он переходит кwpa_supplicant/wpa_supplicant.c:5136
и мы видим:
wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
"id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
ssid->auth_failures, dur, reason);
Итак, вот <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEY
что зарегистрировано.
Поэтому я могу либо убедиться, что wpa_supplicant
он запущен таким образом, что он регистрирует свой вывод в файле, а затем grep
для таких сообщений.
Или я могу запустить его wpa_cli
в интерактивном режиме — в этом режиме он будет подписываться на все wpa_supplicant
сообщения и выводить их.
Поэтому я придумал очень хитрое решение: запустить wpa_cli
скрипт и обмануть его, заставив думать, что он находится в интерактивном режиме:
#!/bin/bash
function poke {
while true
do
printf '\n'
sleep 1
done
}
function watch {
(poke) | wpa_cli | while read line
do
case "$line" in
*'4-Way Handshake failed'*)
echo "incorrect key"
return
;;
*'CTRL-EVENT-CONNECTED'*)
echo "connected"
return
;;
esac
done
}
wpa_cli disable_network 0 > /dev/null
wpa_cli enable_network 0 > /dev/null
watch
wpa_cli
будет выводить только полученные сообщения после того, как будет произведен какой-либо ввод данных пользователем, поэтому poke
функция это и обеспечивает.
Этот скрипт включает нулевую сеть и смотрит, что wpa_supplicant
при этом выводится.
Как я уже сказал, это довольно хакерский подход, но он работает.