正在检查Python应用程序的wpa\u请求输出

2024-06-14 04:58:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Raspberry Pi上有一个Python/Flask web应用程序,它调用以下bash脚本(connect_-to-u-wifi)来连接wifi:

sudo killall wpa_supplicant
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
sudo dhclient wlan0

基本上,用户输入他们的WiFi凭证,这些凭证保存在wpa_supplicant.conf中,然后运行这个脚本。它工作得很好…但是,如果他们输入错误的凭据,dhclient会在失败之前永远挂起。在

我要做的是在继续使用dhclient之前检测凭据是否正确。我知道,如果creds错误,我可以检查wpa_supplicant命令的输出是否有4次握手失败,但是当我通过以下方式从Python应用程序调用此脚本时:

^{pr2}$

未捕获sudo wpa_supplicant -i...行的任何输出。我只想在检测到握手失败时立即结束,但在Python中捕获输出时遇到了困难。在


Tags: 脚本web应用程序flaskconf错误pisudo
2条回答

它不能解决Python问题,但是(假设您能够修改BASH脚本),您可以在BASH脚本中放置一个循环来检查iw wlan0 link的输出,并等待它返回成功消息或达到超时计数器。在建立连接之前,它将返回“Not Connected”。在

只需在调用dhclient之前执行该操作,并且应该相当确定要在其上运行的有效连接。在

大致如下:

sudo killall wpa_supplicant
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

declare -i waitcount=0;
while sudo iw wlan0 link | grep -iq "Not connected"; do
    ((waitcount+=1))
    if (( waitcount > 30 ))
    then
       echo;
       echo "Timeout while waiting for successful association and authentication."
       exit 2;
    fi
    sleep 1s;
    echo -n ".";
done

sudo dhclient wlan0

约翰·布拉德的回答非常干净和可靠,但我很难让它一直有效,因为我对它的评论:

There is a brief period where iw wlan0 link says it is connected even if invalid credentials are entered in wpa_supplicant.conf. I'm assuming it connects, then verifies creds, and if they're wrong, disconnects. So this script doesn't actually work, at least not every time.

最后,在这个答案的帮助下,我所做的是使用wpa_supplicant的-f标志,并将wpa_supplicant的输出写入一个文件。while循环然后返回connected状态,在这种情况下,它将调用dhclient。如果没有连接,它将超时或导致4次握手失败(如果是后者,脚本将提前结束)。在

#!/bin/bash

sudo ip addr flush dev wlan0
sudo killall wpa_supplicant
sudo truncate -s 0 wifi_connection_status.txt
sudo wpa_supplicant -B -i wlan0 -f wifi_connection_status.txt -c /etc/wpa_supplicant/wpa_supplicant.conf

declare -i i=0
declare -i timeout=15
while [ $i -le $timeout ]; do
    if grep -iq 'CTRL-EVENT-CONNECTED' wifi_connection_status.txt; then
        sudo dhclient wlan0
        exit 2
    elif grep -iq '4-Way Handshake failed' wifi_connection_status.txt; then
        exit 2
    fi

    (( i++ ))
    sleep 1
done

相关问题 更多 >