![wpa_supplicant - detectando que minha senha está incorreta?](https://rvso.com/image/1447604/wpa_supplicant%20-%20detectando%20que%20minha%20senha%20est%C3%A1%20incorreta%3F.png)
Se eu especificar uma senha incorreta ao me conectar a uma rede WiFi, existe alguma maneira de detectar que o motivo pelo qual não consigo me conectar é a senha incorreta (em vez de um dos muitos outros motivos possíveis pelos quais alguém pode não conseguir se conectar).
Por exemplo, aqui eu adiciono uma rede, mas especifico deliberadamente a senha errada. Se eu verificar o status, vejo que é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
Se eu escrever um script para ser executado wpa_cli status
repetidamente após selecionar a rede, posso ver que ele passa pelas fases:
SCANNING
ASSOCIATING
4WAY_HANDSHAKE
DISCONNECTED
SCANNING
Então, há alguma maneira de descobrir que a fase de associação/handshake falhou devido a uma senha incorreta? Por exemplo, o evento de desconexão relata algum motivo armazenado e que posso consultar?
Responder1
Se olharmoswpa_supplicant/events.c:2326
Nós 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");
}
Então, quando essa lógica é atingida, ela registra WPA: 4-Way Handshake failed - pre-shared key may be incorrect
.
Depois segue parawpa_supplicant/wpa_supplicant.c:5136
e 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);
Então aqui <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEY
está registrado.
Portanto, posso garantir que wpa_supplicant
seja iniciado de forma que registre sua saída em um arquivo e, em seguida, grep
para essas mensagens.
Ou posso executar wpa_cli
no modo interativo - quando estiver nesse modo, ele assinará e enviará quaisquer wpa_supplicant
mensagens.
Então, a solução muito hackeada que encontrei foi executar wpa_cli
um script e enganá-lo fazendo-o pensar que está no modo interativo:
#!/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
só emitirá quaisquer mensagens recebidas após a ocorrência de alguma entrada do usuário, portanto, a poke
função fornece isso.
Este script habilita a 0ª rede e analisa quais wpa_supplicant
saídas ao fazer isso.
Como eu disse, isso é bastante hacky, mas funciona.