执行如下sh文件
#!/bin/bash
# 用法: sudo ./fix_wifi.sh [SSID] [PASSWORD]
set -e
IF=”wlx7822884b2787″
SSID=”${1:-rtlwap}”
PASSWORD=”${2:-}”
echo “=== 1) 基本信息 ===”
echo “日期: $(date)”
uname -r
echo “—— lsmod 相关模块 ——”
lsmod | egrep -i ‘wl|rtl|8812|88xx|88|rtw|wlanuav’ || true
echo “—— ifconfig/ip link ——”
ip -c addr show “$IF” || ip -c link show
echo “—— iw dev (无线设备) ——”
iw dev || true
echo
echo “=== 2) 查看内核日志(相关条目) ===”
sudo dmesg | egrep -i “$IF|0bda|a81a|rtl88|8812|88×2|rtw|wlanuav|usb” | tail -n 200 || true
echo
echo “=== 3) 确保 RFKILL 未阻塞 ===”
rfkill list || true
echo “尝试解除软件阻塞…”
sudo rfkill unblock all || true
sleep 1
rfkill list || true
echo
echo “=== 4) 关闭驱动/设备的省电(iw)并设置国家码 ===”
sudo iw reg set SG || true
sudo iw dev “$IF” set power_save off || true
echo
echo “=== 5) 让 NetworkManager 管理该接口 ===”
sudo nmcli device set “$IF” managed yes || true
sudo systemctl restart NetworkManager
sleep 1
nmcli device status
echo
echo “=== 6) 重新加载模块(如果模块不稳定可尝试) ===”
# 尝试找到模块并重载(安全尝试)
MODNAME=$(lsmod | egrep -o ‘rtl[[:alnum:]_]*|88[[:alnum:]_]*|wl[a-z0-9_]*’ | head -n1 || true)
if [ -n “$MODNAME” ]; then
echo “检测到模块: $MODNAME — 尝试重载”
sudo modprobe -r “$MODNAME” 2>/dev/null || true
sleep 1
sudo modprobe “$MODNAME” 2>/dev/null || true
else
echo “未检测到可疑模块名称,跳过自动重载”
fi
sleep 1
echo
echo “=== 7) 重置接口并扫描可用 Wi‑Fi ===”
sudo ip link set “$IF” down || true
sleep 1
sudo ip link set “$IF” up || true
sleep 1
echo “扫描(ifname=$IF)…”
sudo nmcli device wifi rescan ifname “$IF” || true
sudo nmcli device wifi list ifname “$IF” || true
echo
echo “=== 8) 清理旧同名连接并尝试连接 ===”
# 删除所有同名的 rtlwap 连接,避免冲突
for id in $(nmcli -t -f NAME,UUID connection show | awk -F: -v s=”$SSID” ‘$1 ~ “^”s {print $2}’); do
echo “删除旧连接 $id”
sudo nmcli connection delete “$id” || true
done
if [ -z “$PASSWORD” ]; then
echo “未提供密码,尝试无密码连接(若是有密码请以第二个参数提供)”
sudo nmcli device wifi connect “$SSID” ifname “$IF” || true
else
echo “尝试连接 SSID=’$SSID’(ifname=$IF)…”
sudo nmcli device wifi connect “$SSID” password “$PASSWORD” ifname “$IF” || true
fi
echo
echo “=== 9) 连接状态与最后日志摘要 ===”
nmcli device status
nmcli connection show –active || true
echo “—– dmesg 相关(尾部 200 行) —–”
sudo dmesg | tail -n 200
echo “如果连接失败,请把上面输出全贴过来(特别是 dmesg 与 nmcli device status)”
