![wpa_supplicant - 偵測到我的密碼不正確?](https://rvso.com/image/1447604/wpa_supplicant%20-%20%E5%81%B5%E6%B8%AC%E5%88%B0%E6%88%91%E7%9A%84%E5%AF%86%E7%A2%BC%E4%B8%8D%E6%AD%A3%E7%A2%BA%EF%BC%9F.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
函數提供了此功能。
此腳本啟用第 0 個網路並查看wpa_supplicant
執行此操作時的輸出。
就像我說的,這很老套,但很有效。