4

Если я укажу неправильный пароль для SSID, есть ли способ обнаружить эту проблему при переключении в сеть?

Например, здесь я добавляю сеть, но намеренно указываю неправильный пароль. Если я проверяю статус, я просто вижу, что это 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 ответ1

4

Если мы посмотрим на 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 при этом.

Как я уже сказал, это довольно забавно, но работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .