![wpa_supplicant - パスワードが間違っていることを検出していますか?](https://rvso.com/image/1447604/wpa_supplicant%20-%20%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%8C%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
WiFi ネットワークに接続するときに間違ったパスワードを指定した場合、接続できない理由が間違ったパスワードであること (接続できない可能性のある他の多くの理由の 1 つではなく) を検出する方法はありますか。
例えば、ここではネットワークを追加していますが、意図的に間違ったパスワードを指定しています。ステータスを確認すると、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
これを実行中にどのような出力が行われるかを確認します。
言ったように、これはかなりハッキーですが、機能します。