简介:针对Ubuntu 20.04用户在安装系统后没有WiFi图标、无法连接无线网络的常见困扰,这份资料以简明问答形式梳理了两条有效解决路径:一是通过有线网络安装bcmwl-kernel-source驱动,解决Broadcom博通无线网卡驱动缺失问题;二是修改Netplan的YAML配置,手动指定无线网卡和WiFi热点信息,并执行netplan try/apply让配置生效。方法一适合博通网卡用户,方法二则适用于系统配置异常、需要手动管理网络的情况,文中还特别提醒先用有线联网并可通过ip a命令确认无线网卡名称,便于新手精准操作。整份资源为1个PDF文件,约36KB,内容紧凑、步骤清晰,适合对照终端命令逐步执行。目前已有超过2万人浏览学习,说明该问题在Ubuntu 20.04用户中相当普遍。读者可从中直接获取可复制的命令、配置文件示例及关键排错思路,快速恢复WiFi连接,减少盲目摸索的时间成本。
1. ubuntu20.04连接wifi的方法:两条路,一条图形一条命令行
“ubuntu20.04连接wifi的方法(2种)”——听上去是个基础教学,可真在装完系统的机子上走一遍,你会发现卡点不在“点哪里”,而在“有没有图标”和“图标消失了怎么办”。图形界面和 nmcli 命令行是最常用的两条路:前者适合桌面正常、能看到托盘图标的场景,点几下就完事;后者适合无桌面环境、SSH 进去只剩一行命令的情形,而且命令行一旦学会,可以在没有图形界面的服务器上稳定复现。这篇先把两条路的完整操作讲透,再针对“ubuntu20.04没有wifi选项”这类高频问题给排查顺序。无论新手还是老手,照着走能少踩一半坑。
2. 图形界面连wifi:从托盘图标到连接成功的完整操作
2.1 先确认网络图标与NetworkManager状态
Ubuntu20.04 默认 GNOME 桌面,右上角状态栏有一个扇形无线信号图标。正常情况下左键点击,会弹出附近 wifi 列表和“打开 Wi-Fi”开关。如果你看到的图标是个灰色圆点、或者压根没有图标,先不要急着怀疑硬件,大概率是 NetworkManager 这个网络管理服务没起来。
先跑一条命令确认服务状态。如果在桌面环境里,可以用 Ctrl+Alt+T 打开终端;没有终端窗口也可以用虚拟控制台:
systemctl status NetworkManager # 显示 inactive (dead) 时,启动它并设为开机自启 sudo systemctl start NetworkManager sudo systemctl enable NetworkManager逻辑说明:NetworkManager 是 Ubuntu20.04 桌面管理网络连接的核心服务,wifi 扫描、连接、断线重连全部挂在它下面。它没起来,右上角图标自然失灵。注意不要和systemd-networkd搞混,那是另一种网络管理方案,两者同时运行会互抢网络接口,导致设置面板里看不到 wifi,这一点在第五章还会提。
服务正常后,再用 nmcli 看一眼无线网卡是否被系统识别:
nmcli device status # 输出里应有一行 type 为 wifi 的设备,例如 wlan0 # STATE 是 disconnected 代表识别但未连接 # STATE 是 unmanaged 代表网卡没有交给NetworkManager管理我一般会对着这个输出做判断:如果完全没有 wifi 设备,说明驱动或固件有问题,跳去第四章;如果是 unmanaged,说明被其他网络服务接管,需要手动改回 managed,第五章有具体命令。图形界面连接正常之前,这两步排查是值得做的。
2.2 连接可见wifi与手动添加隐藏网络
确认服务正常后,图形界面连接就很快了。左键点击右上角扇形图标,列表里会出现周边扫描到的 wifi 名称。点击你要连的那个名字,系统弹出密码输入框,输完点“连接”。稍等几秒,图标变成实心扇形,表示已经关联上路由器并拿到 IP。
这里有个新手高频翻车点:密码明明是对的,但就是连不上。先检查密码有没有被输入法切到中文全角,或者密码的最后一个字符是不是误带了个空格。另外,如果路由器设置了隐藏 SSID,列表里根本不会出现名字,这时需要在设置里手动添加:
- 左键点击托盘 wifi 图标,选“Wi-Fi 设置”。
- 在设置窗口里点“隐藏网络”旁边的下拉按钮,选择“连接到隐藏网络”(不同桌面版本按钮位置略有差异)。
- 弹出的对话框里填两个关键字段:
- 网络名称(SSID):必须和路由器后台里设置的一字不差,注意大小写和空格。
- Wi-Fi 安全性:默认选择 WPA2 个人级,如果路由器是 WPA3 且网卡驱动较老,先改成 WPA2 试试。
这个对话框的“隐藏网络”名字容易让人误解——它不是让你输入一个隐藏网络列表,而是让你手动声明“我要连接的 SSID 不出现在扫描列表里”。填完点“连接”,再输一次 wifi 密码即可。
2.3 连上后验证与常见失败参数
连接成功后不要急着关设置,先验证状态。图标变成实心只是第一步,更可靠的办法是看 IP 有没有拿到:
nmcli connection show --active # 如果列出你的SSID,且 TYPE 是 802-11-wireless,说明连接配置已生效 # 再看具体IP nmcli device show wlan0 | grep IP4图形界面连不上的时候,我优先核对三个参数,而不是重装驱动:
- 频段:路由器如果开启双频合一,有些老网卡只认 2.4G,看不到 5G 的 SSID 是正常的。可以先在路由器后台把 2.4G 和 5G 分开命名,再逐个试。
- 加密协议:WEP 老路由在 Ubuntu20.04 下大概率连不上,建议改用 WPA2。WPA3 则需要网卡驱动和 wpa_supplicant 版本都支持。
- 信号强度:在设置面板里能看到信号格数。信号弱时连接会反复掉线,图形界面表现为“已连接”几秒后变成“已断开”。这种问题靠移动位置或加 AP 解决,改配置没用。
下面这张表可以作为图形界面排查的快速参考:
| 参数 | 正常表现 | 异常表现 | 处理方式 |
|---|---|---|---|
| NetworkManager | active (running) | inactive | systemctl start |
| 无线网卡状态 | disconnected | unavailable / unmanaged | 看第四章、第五章 |
| 频段 | 2.4G/5G 可见 | 只看到某一频段 | 路由器分频段 |
| 加密协议 | WPA2/WPA3 | 反复认证 | 切 WPA2 |
图形界面适合桌面环境正常的场景,但如果你面对的是服务器、树莓派,或者想写成自动化脚本,命令行才是真正的主动权。
3. 命令行nmcli连wifi:无桌面也能稳定连上的操作步骤
3.1 定位网卡与服务状态
没有图形界面时,NetworkManager 自带的nmcli是最可靠的 wifi 管理工具。它不是额外安装的,只要系统里有 NetworkManager,就一定有 nmcli。这点比某些第三方工具稳,也适合在脚本里调用。
打开终端或 SSH 进去后,第一件事永远是看一眼网卡状态:
nmcli device status # DEVICE TYPE STATE CONNECTION # wlan0 wifi disconnected -- # eth0 ethernet unmanaged --重点看 wifi 那一行的 STATE。常见状态有三种:
unavailable:网卡被射频开关或驱动禁用,wifi 功能当前不可用。disconnected:网卡已就绪,只是没连接任何网络,这是最理想的起点。unmanaged:网卡被 NetworkManager 之外的服务接管,需要处理后再执行连接。
如果显示 unavailable,先用rfkill查一下是不是被软件禁用了:
rfkill list # 看到 wlan0 有 Soft blocked: yes 时,执行 rfkill unblock wifi参数说明:rfkill unblock wifi是解锁全部无线射频设备,执行后再看nmcli device status,wifi 状态会从 unavailable 变成 disconnected。很多笔记本有物理飞行模式键或快捷键,按下后系统会软屏蔽无线网卡,这个坑在装完 ubuntu20.04 的 ThinkPad、Dell 上特别常见。
3.2 扫描与连接的最小命令
网卡状态变成 disconnected 后,扫描周边的 wifi:
sudo nmcli device wifi list # 输出 SSID、信号强度、频段、加密方式 # 如果列表为空,先检查是不是被 rfkill 锁住,或者网卡不支持当前频段注意这里用了 sudo。部分网卡在非 root 权限下无法触发扫描,识别不到列表会误导你以为是驱动坏了。我遇到过好几台机器,第一次必须以 sudo 扫描,之后的扫描普通用户权限也能出来,属于驱动缺陷,不算正常现象。
找到目标 wifi 后,一条命令完成连接:
sudo nmcli device wifi connect "MyWiFi" password "MyPassword" # 连接成功后会显示 "Device 'wlan0' successfully activated"参数说明:device wifi指定操作对象是 wifi 设备;connect是动作;后面的 SSID 和 password 是必修参数。如果 wifi 名称或密码里有$、空格、双引号这类特殊字符,务必用双引号包住整个字符串;如果密码本身包含双引号,就要用反斜杠转义,或者改用单引号策略。
这条命令是“连接即保存”的快捷方式。NetworkManager 会自动在/etc/NetworkManager/system-connections/下生成一个连接配置文件,下次开机会自动尝试连同一个 SSID。如果你想临时连接但不想保存配置,可以加--ask等参数,不过日常使用中我更喜欢让它保存。
3.3 隐藏wifi与静态IP的场景配置
要连隐藏网络,普通扫描看不到 SSID,需要额外指定hidden yes:
sudo nmcli device wifi connect "HiddenSSID" password "pass" hidden yes # 告诉NetworkManager:去主动扫描这个SSID,即使它没有广播这个参数在某些版本里写作--hidden,但 Ubuntu20.04 自带的 nmcli 支持hidden yes这种键值对写法。注意隐藏网络在路由器端如果还开启了“隐藏后仅允许指定 BSSID 接入”这类策略,客户端即使填对 SSID 也连不上,需要在路由器后台确认过滤规则。
连上之后,如果公司或学校网络要求静态 IP,用connection modify修改这条配置:
# 先查看当前激活的连接名,通常是SSID文本 nmcli connection show --active # 改为手动IP,并设置地址、网关、DNS sudo nmcli connection modify "MyWiFi" ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "223.5.5.5 1.1.1.1" # 重新激活连接使配置生效 sudo nmcli connection down "MyWiFi" && sudo nmcli connection up "MyWiFi"参数说明:ipv4.method manual表示不用 DHCP 而用手动配置;ipv4.addresses里的/24是子网掩码长度,即 255.255.255.0;ipv4.gateway是路由器地址;ipv4.dns可以写多个,用空格分隔,NetworkManager 会自动按顺序写入。如果之后想恢复自动获取 IP,把manual改回auto,再 down/up 一次即可。
这里提醒一句:修改配置后不执行down和up,当前会话不会应用新 IP,很多人看到配置没生效就以为命令错了,其实只是没重新激活连接。
# 顺便关注自动连接开关 sudo nmcli connection modify "MyWiFi" connection.autoconnect yes # 确保开机自动连接,默认就是yes,但如果之前被改过,这里可以强制确认命令行方案最大的价值在可脚本化。你甚至可以把它写进一个启动脚本,开机后自动检测 wifi 状态并发起重连,这也是第六章会讲到的进阶用法。
4. ubuntu20.04没有wifi选项的排查:网卡驱动与内核模块处理
4.1 先定位:是硬件没识别还是驱动没加载
很多用户装完 ubuntu20.04,打开设置只有“有线”和“热点”,连“Wi-Fi”这个侧边栏都没有。这不是系统给你砍了功能,而是无线网卡驱动没加载,或者固件缺失。第一步要判断是硬件没识别,还是驱动没加载。
用一条命令看无线网卡的 PCI 信息和内核驱动状态:
lspci -nnk | grep -i net # 输出类似: # 03:00.0 Network controller [0280]: Intel Corporation Wireless 8260 [8086:24f3] # Subsystem: Intel Corporation Wireless 8260 [8086:0010] # Kernel driver in use: iwlwifi这里的关键是最后一行。如果显示Kernel driver in use: iwlwifi,说明驱动已经被内核加载,剩下可能是固件问题;如果显示Kernel driver in use: 无,或者干脆没有这一行,那就是驱动没加载成功。[0280]是 PCI 类别代码,代表无线控制器,只要看到这行,说明硬件本身被总线识别了,问题只出在软件层。
还有一种特殊情况:lspci | grep -i net完全没输出。这种要么是无线网卡被 BIOS 禁用,要么是 MXM 接口没有供电。前者去 BIOS 设置里找 Wireless LAN 选项打开,后者多出现在双网卡的笔记本,物理开关没拨到位。
4.2 常见网卡芯片的驱动对策
Ubuntu20.04 默认内核是 5.4,后续可用 HWE 内核升级到 5.15。大部分芯片在内核里有驱动,但固件不一定齐全。我把常见的三种情况列出来:
| 芯片厂商 | 代表型号 | 驱动来源 | 常见问题 |
|---|---|---|---|
| Intel | 8260/8265/9260/AX200 | 内核自带 iwlwifi | 固件缺失,需要 linux-firmware 包 |
| Realtek | RTL8821CE/RTL8822CE | 外载 DKMS 模块 | 内核自带驱动不稳定,需编译 |
| Atheros | AR9271/QCA9377 | 内核自带 | 通常即插即用,偶有射频锁 |
Intel 的处理最省事,直接装固件包并重新加载模块:
sudo apt update sudo apt install linux-firmware # 更新固件后,重新加载iwlwifi模块 sudo modprobe -r iwlwifi && sudo modprobe iwlwifi逻辑说明:linux-firmware是一个包含大量硬件固件的 deb 包,不止 wifi,还有蓝牙、显卡等的固化程序。modprobe -r先卸载模块,再modprobe重新加载。注意如果你的系统在装这个包之前是靠有线网络联网的,apt 依赖能正常解决;如果彻底没网,你需要用另一台电脑下载 deb 包,U 盘拷贝后sudo dpkg -i安装。
Realtek 的 RTL8821CE 是入门笔记本的常客,但它在 Ubuntu20.04 上经常翻车。常见做法是安装 DKMS 版本的驱动,这样内核升级后驱动会自动重新编译:
# 先安装编译工具链 sudo apt install build-essential dkms git # 克隆驱动源码(注意:以下仓库地址仅为示例,请以当前维护的最新版本为准) git clone https://github.com/示例/rtl8821ce.git cd rtl8821ce sudo ./dkms-install.sh参数说明:dkms-install.sh脚本本质上是把驱动编译进 DKMS 框架,然后注册到当前内核。这里要特别提醒:不要照抄网上的任何固定仓库地址,GitHub 上这个芯片的镜像很多,有的已经停止维护,有的只支持旧内核。正确做法是搜索rtl8821ce dkms ubuntu 20.04,找一个更新时间在一年内、issue 区还有维护者回复的仓库。装好后如果还有问题,优先看脚本的输出,报错里通常有内核头文件缺失或 gcc 版本不匹配的提示。
4.3 加载模块、固件缺失与开机自启
驱动装好后,手动加载模块并检查是否生效:
sudo modprobe rtl8821ce nmcli device status # 如果wifi设备出现了,说明模块加载成功 # 如果报错,用dmesg看内核日志定位 dmesg | tail -n 30常见的报错是Direct firmware load for rtl8821ce ... failed,这种属于固件文件缺失或路径不对。检查/lib/firmware/目录下有没有对应的.bin文件。没有的话,需要从驱动包或额外固件包手动放置,并确保权限是 644。
模块可以手动加载成功后,我希望重启也能自动加载,这时可以写入/etc/modules:
echo "rtl8821ce" | sudo tee -a /etc/modules # 追加模块名,重启后内核会尝试自动加载注意/etc/modules每行只能写一个模块名,不带路径参数。有些模块其实已经被内核通过依赖关系加载,重复追加会打印警告,但不影响启动。我一般只对那种确认手动加载有效的模块才写,避免画蛇添足。
4.4 最省事的备选方案:USB网卡与内核实策略
如果驱动怎么折腾都搞不定,我建议两条逃生通道:升级内核,或者用一个外置 USB 网卡。
Ubuntu20.04 的官方软件源里可以直接装 HWE 内核:
sudo apt install linux-generic-hwe-20.04 # 安装后重启,选择新内核启动新内核一般会包含更新的无线网卡驱动。Realtek 芯片在老内核里的rtw88驱动很不完善,升级到 HWE 后反而有概率直接免驱。代价是 HWE 内核的更新节奏快一些,但作为桌面应用够用。
外置 USB 网卡的选择也有讲究。优先选 Atheros AR9271、RTL8188 这类在 Linux 下有稳定驱动方案的芯片,它们通常在插上后就能被识别,不需要手动编译。虽然速率不高,但它的价值在于先把系统联网,然后再解决内置网卡的问题——这算是我折腾无数次后总结出的后悔药:别跟驱动死磕太久,让系统先联网,后面所有的事都容易了。
5. 避坑记录:ubuntu20.04连wifi时最常见的5个坑
5.1 现象:连接显示成功,但网页打不开
这是连完 wifi 后最常见的尴尬场景。状态栏图标已经变成实心,nmcli connection show --active也能看到 SSID,但浏览器就是加载不出页面,ping 域名也报 unknown host。
原因通常是路由器的 DHCP 下发了 IP,但 DNS 没有同步下来,或者是systemd-resolved和 NetworkManager 的 DNS 配置打架。Ubuntu20.04 默认/etc/resolv.conf会指向127.0.0.53,这是 systemd-resolved 的守护进程地址,如果它上游配置丢了,系统就解析不了域名。
解决方法是强制让 NetworkManager 指定 DNS,并忽略 DHCP 下发的 DNS:
sudo nmcli connection modify "MyWiFi" ipv4.dns "223.5.5.5 1.1.1.1" ipv4.ignore-auto-dns yes sudo nmcli connection down "MyWiFi" && sudo nmcli connection up "MyWiFi"参数说明:ipv4.ignore-auto-dns yes的意思是忽略路由器通过 DHCP 分配的 DNS 服务器。很多家用的光猫会下发一个内网 DNS 地址,但该地址在桥接模式下无效,所以得手动覆盖。修改后可以用systemd-resolve --status或resolvectl status验证 DNS 是否生效。不要直接改/etc/resolv.conf,那是一个软链接,改完会被 systemd 重置。
5.2 现象:密码正确,但一直弹出认证窗口
明明密码能背出来,图形界面却反复弹出 wifi 密码输入框,输完点连接,转两圈又弹出来。这种情况在网络环境里很常见,尤其是密码含特殊字符或加密协议不匹配的时候。
原因分两类:一类是密码在输入时被图形界面的输入法或者双引号转义搞错了,比如密码里有$、\、空格;另一类是路由器设置了 WPA3 强制加密,但网卡驱动对 WPA3 支持不完整,导致握手阶段失败。
命令行连接时,最稳妥的姿势是单引号包住密码:
sudo nmcli device wifi connect "MyWiFi" password 'p@ssw$rd' # 单引号内的所有字符都按字面量处理,$ 和 ! 不会被bash展开另外,到路由器后台把安全模式改成“WPA2/WPA3 混合”或直接“WPA2”,能解决很大一部分兼容性代价。如果路由器只允许 WPA3,那又另当别论,需要换网卡或升级驱动。还有一个容易忽略的点:企业级加密(802.1X)需要额外配置 CA 证书和身份认证方式,家用密码认证在这里也会一直转圈,排查时先确认路由器的认证模式是不是 WPA-PSK。
5.3 现象:休眠或合盖后wifi消失
笔记本休眠唤醒后,右上角 wifi 图标变成灰色,点击里面什么都没有,nmcli device status显示 wifi 设备 unavailable。重启之后才会恢复。
原因是网卡设备的电源管理在 suspend 阶段被挂起,唤醒后驱动没能重新初始化射频。这在 Intel 网卡上很常见,尤其是 8265、9260 这类老芯片。
先解锁射频,再把网卡的节能模式关掉:
rfkill list # 如果看到 Soft blocked: yes,执行 unblock sudo rfkill unblock wifi # 禁用wifi网卡的电源节能 sudo nmcli connection modify "MyWiFi" 802-11-wireless.powersave 2 sudo nmcli connection up "MyWiFi"参数说明:powersave值有三个:0 是关闭节能,1 是使用节能,2 是默认设置。写作 2 时会沿用驱动默认,写 0 能有效避免休眠唤醒掉线。如果想让系统在唤醒后自动执行rfkill unblock,可以写一个 systemd service,或者直接在/etc/pm/sleep.d/下放脚本。不过这个方案仅对支持标准电源管理回调的笔记本有效,个别品牌机还有额外的 BIOS 强制管理,这时候只能改 BIOS 里的无线电选项。
5.4 现象:搜不到5G频段的wifi
周边一堆 2.4G 的 wifi 都看得到,唯独路由器上的 5G 信号在列表里消失。有人直接得出结论“网卡坏了”,但绝大部分情况不是硬件问题。
原因一是网卡物理上只支持 2.4G,这取决于芯片方案;原因二是网卡支持 5G,但无线监管域(regulatory domain)限制的信道与你路由器的信道不一致。例如在中国区,部分高信道 5G 信道默认不开放,但一些外版路由默认选了这些信道。
先查当前无线监管域:
iw reg get # 输出中可以看到 country # country CN: DFS-UN 表示当前区域是中国区如果你的路由器设置在美区或欧洲的 5G 高频信道,可以临时设置监管域为对应国家再扫描:
sudo iw reg set US sudo nmcli device wifi rescan sudo nmcli device wifi list参数说明:iw reg set US临时将无线监管域改为美国,只影响当前启动周期。如果扫描到了,说明确实是监管域冲突。想要持久化,需要配置 NetworkManager 的无线监管域,常见做法是编辑/etc/default/crda,但注意 Ubuntu20.04 的默认配置可能被全局覆盖,最好直接改/etc/rc.local或者写 systemd 服务。另外提醒一下,路由器选信道时尽量避开检测雷达的 DFS 信道,这类信道在民用环境里经常导致客户端反复断开。
5.5 现象:命令行连接报 "Connection activation failed"
命令行执行nmcli device wifi connect时,有时会直接返回Connection activation failed: (0) No reason given。这个报错看起来像没给原因,实际原因还是能查出来的。
最常见的情况是 wifi 设备处于 unmanaged 状态,NetworkManager 没有权限去激活它。可以先看nmcli device status,如果确实 unmanaged,执行:
sudo nmcli device set wlan0 managed yes # 强制让NetworkManager接管wlan0 sudo nmcli device wifi connect "MyWiFi" password "密码"如果仍然失败,检查是不是systemd-networkd在抢接口。某些软件安装时会自动生成网络配置,导致接口被 systemd-networkd 接管:
sudo systemctl stop systemd-networkd sudo systemctl disable systemd-networkd参数说明:disable只是取消开机自启,不会删除配置文件。如果你依赖 systemd-networkd 管理有线网络,这一步需要慎重。更好的做法是修改/etc/NetworkManager/NetworkManager.conf,在[device]段加wifi.scan-rand-mac-address=no等参数,让 NetworkManager 明确接管无线接口。另外还有一种情况是 NetworkManager 本身连接配置文件损坏,比如手动改过 MAC 地址但没删干净,这时用nmcli connection delete "MyWiFi"删掉重新连接即可。
6. 进阶技巧:给wifi连接写个自愈脚本,彻底告别掉线
图形界面和命令行的操作你都掌握了,剩下的痛点是:wifi 偶尔掉线没人管,或者重启后明明配了自动连接,却因为等 DHCP 太慢一直没连上。我自己的做法是写一个几十行的 bash 脚本,用 ping 判断外网连通性,失败后自动执行nmcli重连,再用 cron 定时跑。这个方案只依赖系统自带的工具,不需要装任何额外依赖。
下面是我常用的脚本骨架,可以直接复制成/usr/local/bin/wifi-autorepair.sh:
#!/bin/bash # wifi自愈脚本:检测外网不可达时自动重连 SSID="MyWiFi" PING_TARGET="223.5.5.5" # 公网DNS,ping通代表外网正常 # 1. 先确认无线设备还在 if ! nmcli device status | grep -q "wifi"; then echo "$(date): wifi device missing, try modprobe" sudo modprobe iwlwifi # 换成你自己的网卡模块名 sleep 3 fi # 2. 如果已经连接,先判断能不能上网 if nmcli device show wlan0 | grep -q "connected"; then if ping -c 2 -W 5 "$PING_TARGET" > /dev/null 2>&1; then exit 0 # 能通,什么也不做 fi fi # 3. 走到这说明断了或没连上,强制down/up sudo nmcli connection down "$SSID" 2>/dev/null sudo nmcli connection up "$SSID" sleep 10 # 等DHCP和关联完成 # 4. 重试验证 if ping -c 2 -W 5 "$PING_TARGET" > /dev/null 2>&1; then echo "$(date): wifi repaired" else echo "$(date): repair failed, check interface" fi脚本逻辑说明:先确认 wifi 设备存在,再判断是否处于已连接状态并能 ping 通公网,能通则直接退出,不通则强制重连这条 connection,等 10 秒后再次验证。sleep 10是为了给 DHCP 留出时间,如果设置太短,网卡还没拿到 IP 就会误报失败。
把这个脚本加入 crontab 每两分钟执行一次:
sudo chmod +x /usr/local/bin/wifi-autorepair.sh (crontab -l 2>/dev/null; echo "*/2 * * * * /usr/local/bin/wifi-autorepair.sh" ) | crontab -验证方法很简单:先手动断一次 wifi,然后等两分钟,再执行nmcli connection show --active,应该能看到 SSID 回来了。如果想看脚本是否成功跑过,grep wifi-autorepair /var/log/syslog不一定有输出,因为脚本只把成功信息打印到 stdout 而 cron 会把它丢掉。更好的方式是在脚本里加一个>> /var/log/wifi-autorepair.log重定向,方便事后排查。
如果你的系统里没有 cron,可以用 systemd timer 替代,逻辑完全一样,只是从“定时任务”变成了“定时器单元”。我个人习惯先用 cron 跑通逻辑,因为 cron 的排错成本更低,等确认脚本稳定后再考虑迁移到 systemd。实际运行半年下来的经验是:真正触发自愈的次数其实不多,但每次触发都是深夜路由器重启、光猫切换或网卡掉驱动这种场景,能省下第二天早上手动折腾的功夫。
最后留个教训:PING_TARGET一定要选一个稳定的公共 DNS,比如 223.5.5.5 或 119.29.29.29,不要写成本机 IP 或路由器地址,那样只能验证局域网通不通,外网断了它反而认为一切正常。重连命令之间最好留 5 秒以上间隔,频繁重连会让路由器误判你在做无线探测,反而把你的网卡临时拉黑。这个脚本我在三台 ubuntu20.04 机器上用了大半年,总体收益大于维护成本。如果你也经常被“掉线后不在旁边”困扰,值得照着搭一套。希望帮到你。
本文还有配套的精品资源,点击获取