Ubuntu 20.04 智能热点管家:用 nmcli 与 systemd 实现网络状态感知与自动切换
你是否经历过这样的场景:带着笔记本在咖啡馆、机场或客户现场,需要快速为手机或其他设备提供一个临时的网络接入点,但每次都要手动开启热点,用完还得记得关闭,既繁琐又容易忘记,导致设备电量白白消耗?或者,你搭建了一个基于树莓派或旧笔记本的移动工作站,希望它能智能地在外网断开时自动成为局域网中心,连接成功后又能自动“隐身”,回归普通客户端角色?对于追求效率的开发者、极客和移动办公者而言,网络管理的自动化不是“锦上添花”,而是“雪中送炭”的刚需。
传统的WiFi热点设置,无论是通过图形界面点击,还是执行固定的命令行,都缺乏对环境的感知能力。它们像是一个需要手动拨动的开关,而不是一个能根据光线明暗自动调节的智能灯泡。本文将带你深入Ubuntu 20.04(同样适用于22.04等使用NetworkManager的现代发行版),利用系统自带的强大网络管理工具nmcli和服务管理框架systemd,构建一个真正“聪明”的WiFi热点。这个热点能主动探测互联网连接状态,在断网时自动开启,为你和你的设备提供应急网络;一旦检测到主网络恢复,又能自动关闭,节约资源并避免不必要的网络暴露。整个过程无需人工干预,实现全天候的智能网络守护。
1. 核心理念与工具栈:为何选择 nmcli 与 systemd?
在开始动手之前,理解我们为何选择这套技术组合至关重要。这并非随意拼凑,而是基于Ubuntu现代网络架构的深思熟虑。
NetworkManager (nmcli) 是当今Linux桌面和服务器领域事实上的标准网络配置管理工具。与古老的net-tools(如ifconfig、iwconfig)或需要复杂脚本的netplan底层配置相比,nmcli提供了对NetworkManager所有功能的全命令行访问。它的优势在于:
- 状态感知:NetworkManager本身就在持续管理网络连接状态,我们能基于此状态进行决策。
- 配置持久化:通过
nmcli创建的热点配置会被保存为连接配置文件(通常位于/etc/NetworkManager/system-connections/),重启后依然存在。 - 稳定可靠:作为系统级服务,其创建和管理热点的方式比临时性的
hostapd脚本更规范,与系统网络栈集成度更高。
systemd 则是现代Linux系统的初始化系统和服务管理器。我们将利用它来:
- 托管监控脚本:将我们的网络状态检测和热点控制逻辑封装成一个系统服务。
- 定义依赖关系:确保我们的脚本在网络就绪后(
After=network.target)才启动。 - 实现故障恢复:通过
Restart=on-failure等参数,让服务在意外退出时能自动重启,增强鲁棒性。
而智能化的核心逻辑,在于一个简单的“探测-决策-执行”循环。我们将编写一个脚本,定期(或基于事件)检查主机是否能够访问互联网。如果检测到断网,则触发热点开启命令;如果检测到网络恢复,则触发热点关闭命令。这个逻辑看似简单,但要处理各种边界情况(如短暂网络抖动、服务启动顺序),就需要精细的设计。
注意:本文方案创建的是标准的“WiFi热点”(即接入点模式,AP Mode),而非“Ad-hoc”网络(点对点模式)。Ad-hoc模式兼容性较差,很多现代设备(如iPhone、部分安卓机)已不支持。AP模式是通用且稳定的选择。网络搜索中提到的“Ad-hoc”热词,我们在此明确转向更优的AP模式实现。
2. 环境准备与基础热点创建
首先,我们需要一个正常运行的Ubuntu 20.04系统,并确保无线网卡支持AP(接入点)模式。同时,系统应已安装NetworkManager,这通常是桌面版的默认配置。
2.1 检查无线网卡与驱动支持
打开终端,执行以下命令检查你的无线网卡接口名称和AP支持情况:
# 查看网络接口,无线网卡通常以 wl(如 wlp3s0, wlan0)开头
ip link show
# 使用 iw 工具检查无线设备能力,查找 “AP” 在支持的模式列表中
iw list | grep -A 10 “Supported interface modes”
关键输出示例:
...
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* monitor
...
如果输出中包含 “AP”,恭喜你,你的网卡支持创建热点。如果只有“managed”(托管模式),则可能无法创建热点,或需要安装额外的驱动。
2.2 使用 nmcli 创建持久化热点配置
我们不使用一次性命令,而是创建一个有名字、可重复管理的连接配置。这比每次输入SSID和密码更专业。
# 创建一个名为 “MyAutoHotspot” 的热点连接配置
# 将 ifname 替换为你的无线网卡接口名,ssid 和 password 按需修改
sudo nmcli connection add type wifi ifname wlp3s0 con-name MyAutoHotspot autoconnect no ssid UbuntuSmartAP
sudo nmcli connection modify MyAutoHotspot 802-

55

被折叠的 条评论
为什么被折叠?



