![wpa_supplicant: ¿detectando que mi contraseña es incorrecta?](https://rvso.com/image/1447604/wpa_supplicant%3A%20%C2%BFdetectando%20que%20mi%20contrase%C3%B1a%20es%20incorrecta%3F.png)
Si especifico una contraseña incorrecta cuando me conecto a una red WiFi, hay alguna forma de detectar que la razón por la que no puedo conectarme es la contraseña incorrecta (en lugar de una de las muchas otras razones posibles por las que uno podría no poder conectarse).
Por ejemplo, aquí agrego una red pero especifico deliberadamente una contraseña incorrecta. Si reviso el estado solo veo que esSCANNING
# 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
Si escribo un script para ejecutarlo wpa_cli status
repetidamente después de seleccionar la red, puedo ver que pasa por las fases:
SCANNING
ASSOCIATING
4WAY_HANDSHAKE
DISCONNECTED
SCANNING
Entonces, ¿hay alguna manera de descubrir que la fase de asociación/apretón de enlace falló debido a una contraseña incorrecta? Por ejemplo, ¿el evento de desconexión informa algún motivo que está almacenado y que luego puedo consultar?
Respuesta1
si miramoswpa_supplicant/events.c:2326
vemos:
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");
}
Entonces, cuando se alcanza esta lógica, se registra WPA: 4-Way Handshake failed - pre-shared key may be incorrect
.
Luego continúa haciawpa_supplicant/wpa_supplicant.c:5136
y vemos:
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);
Así que aquí <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEY
está registrado.
Entonces puedo asegurarme de que wpa_supplicant
se inicie de manera que registre su salida en un archivo y luego grep
para dichos mensajes.
O puedo ejecutarlo wpa_cli
en modo interactivo; cuando esté en este modo, se suscribirá y enviará cualquier wpa_supplicant
mensaje.
Entonces, la solución muy ingeniosa que se me ocurrió fue ejecutar wpa_cli
un script y engañarlo haciéndole creer que está en modo interactivo:
#!/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
solo generará cualquier mensaje que haya recibido después de que se haya producido alguna entrada del usuario, por lo que la poke
función proporciona esto.
Este script habilita la red 0 y analiza qué wpa_supplicant
resultados se obtienen mientras se hace esto.
Como dije, esto es bastante complicado pero funciona.