Если мы посмотрим на 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
функция обеспечивает это.
Этот скрипт активирует 0- ую сеть и смотрит на то, что wpa_supplicant
выводит при этом.
Как я уже сказал, это довольно забавно, но работает.