![wpa_supplicant - 내 비밀번호가 잘못된 것을 감지합니까?](https://rvso.com/image/1447604/wpa_supplicant%20-%20%EB%82%B4%20%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8%EA%B0%80%20%EC%9E%98%EB%AA%BB%EB%90%9C%20%EA%B2%83%EC%9D%84%20%EA%B0%90%EC%A7%80%ED%95%A9%EB%8B%88%EA%B9%8C%3F.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
.
내가 말했듯이 이것은 꽤 해키지만 작동합니다.