如何在Ubuntu 22.04的Bash脚本中判断WiFi密码是否错误?
如何在Ubuntu 22.04的Bash脚本中判断WiFi密码是否错误?
这个问题我之前配置Ubuntu服务器WiFi时也碰到过——单纯靠ping服务器确实没法区分密码错误和其他网络问题(比如信号弱、网关不可达)。在Ubuntu 22.04下,我们可以借助NetworkManager(或对应后端服务)的工具和日志来精准判断密码错误情况,下面给你几个实用方法:
方法一:用nmcli直接查询连接状态
Ubuntu 22.04桌面版默认用NetworkManager作为网络后端,哪怕你用netplan配置,最终也是交给它处理。nmcli是NetworkManager的命令行工具,能直接获取连接的错误信息:
- 先给系统留10-15秒完成连接尝试,再在脚本中加入以下代码:
# 替换成你的WiFi SSID WIFI_SSID="你的WiFi名称" # 获取对应连接的名称(可能和SSID一致,也可能自动生成) CONNECTION_NAME=$(nmcli connection show | grep "$WIFI_SSID" | awk '{print $1}') # 查询连接的自动连接错误信息 ERROR_INFO=$(nmcli connection show "$CONNECTION_NAME" | grep -i "autoconnect-error" | awk -F': ' '{print $2}') if [[ "$ERROR_INFO" == *"invalid password"* ]]; then echo "⚠️ 连接失败:WiFi密码不正确!" elif [[ "$(nmcli device status | grep wlan0 | awk '{print $3}')" == "connected" ]]; then echo "✅ WiFi连接成功!" else echo "❌ 连接失败,但不是密码错误,可能是信号弱、网络不可达等其他原因" fi
方法二:查看NetworkManager系统日志
NetworkManager会把所有连接细节记录到systemd的journal日志里,我们可以过滤日志定位密码错误:
# 查看最近1分钟内NetworkManager的日志,过滤密码错误相关关键词 PASSWORD_ERROR=$(journalctl -u NetworkManager.service --since "1 minute ago" | grep -i "invalid.*password\|authentication failed\|handshake failed") if [[ -n "$PASSWORD_ERROR" ]]; then echo "⚠️ 检测到密码错误:" echo "$PASSWORD_ERROR" else # 再检查是否连接成功 if nmcli device status | grep -q "wlan0.*connected"; then echo "✅ WiFi连接成功!" else echo "❌ 连接失败,未检测到密码错误,请排查其他问题" fi fi
注意:如果脚本没有sudo权限,可能无法查看完整日志内容,建议给脚本加上sudo或者在命令前加sudo。
方法三:针对systemd-networkd后端的情况
如果你的Ubuntu是服务器版,用networkd作为netplan后端(而非NetworkManager),这时会用wpa_supplicant管理WiFi连接,可以查看它的日志:
# 查看wpa_supplicant的日志,过滤密码错误相关内容 PASSWORD_ERROR=$(journalctl -u wpa_supplicant@wlan0.service --since "1 minute ago" | grep -i "invalid PSK\|authentication failed") if [[ -n "$PASSWORD_ERROR" ]]; then echo "⚠️ WiFi密码错误,连接失败!" else echo "✅ WiFi连接成功(或未检测到密码错误)" fi
一些注意事项
- 必须留足够的连接等待时间:刚运行
netplan apply就立刻检查肯定得不到准确结果,建议等待10-15秒再执行判断逻辑。 - 连接名称要准确:如果你的WiFi连接名称和SSID不一致,可以用
nmcli connection list手动确认。 - 权限问题:查看日志或某些
nmcli操作可能需要sudo权限,记得在脚本里处理好权限。
备注:内容来源于stack exchange,提问作者Jason C
相关产品推荐
相关产品推荐

