Wenn wir uns anschauen wpa_supplicant/events.c:2326
, sehen wir:
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"); }
Wenn diese Logik getroffen wird, protokolliert sie WPA: 4-Way Handshake failed - pre-shared key may be incorrect
.
Dann geht es weiter wpa_supplicant/wpa_supplicant.c:5136
und wir sehen:
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);
Also hier <3>CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="MyPlace" auth_failures=1 duration=10 reason=WRONG_KEY
wird protokolliert.
So kann ich entweder sicherstellen, dass wpa_supplicant
so gestartet wird, dass es seine Ausgabe in eine Datei und dann grep
für solche Meldungen protokolliert .
Oder ich kann wpa_cli
im interaktiven Modus laufen - wenn er sich in diesem Modus befindet, werden alle wpa_supplicant
Nachrichten abonniert und ausgegeben .
Die hackigste Lösung, die ich mir ausgedacht hatte, bestand darin, wpa_cli
ein Skript auszuführen und es zu täuschen, dass es sich im interaktiven Modus befindet:
#!/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
gibt nur die empfangenen Nachrichten aus, nachdem eine Benutzereingabe erfolgt ist, so dass die poke
Funktion dies bereitstellt.
Dieses Skript aktiviert das 0- te Netzwerk und betrachtet dabei die wpa_supplicant
Ausgänge.
Wie gesagt, das ist ziemlich hackig, aber es funktioniert.