nmrs这个库出现已经有一阵了,2026年开春以来它迭代的节奏明显加速——v3.0.0刚在前两天砸下来,带来了VPN支持、Wi-Fi scoping、secret agent API这一大串重量级的更新。老实说,Linux上处理NetworkManager绑定这件事,这些年翻来覆去就是nmcli和nm-applet这两条路,前者是命令行里的瑞士军刀但脚本化体验割裂,后者是个拖着GTK3尾巴的老旧托盘程序。nmrs不一样——它是一套Rust async-first的NetworkManager D-Bus绑定,底核基于zbus,在提供完整Wi-Fi管理和VPN功能的同时,保持了类型安全和极低的资源消耗。这个组合,在Node.js或Python生态压根见不着。这玩意儿到底是干嘛的。用一句话概括:nmrs是一个纯Rust实现的异步NetworkManager客户端库,附带一个Wayland兼容的GTK4图形界面版本叫nmrs-gui。它不调nmcli,不走nmcli那层成天冒Human-readable文本输出的壳,直接用D-Bus守护进程和NetworkManager通信。api层面的设计目标是让开发者能用Rust编写高性能、可靠且安全的网络管理工具,同时对桌面用户也提供一个现代化的图形化前端。对于开发来说,nmrs提供了从扫描无线网络、连接WPA加密热点到管理VPN(WireGuard和OpenVPN)的几乎全套接口;对于用户来说,nmrs-gui则在极低资源消耗基础上给出了一个能在Hyprland、Sway这些平铺窗口管理器下原生工作的网络面板。上手之前先把依赖搞对。nmrs要求NetworkManager在Linux系统上跑着,D-Bus服务可用,同时Rust工具链版本至少1.94.0。cargo项目的依赖部分其实不复杂,但涉及feature层面有些可控的开关。Cargo.toml里大致这样:[dependencies]tokio = { version = "1", features = ["full"] }nmrs = "3.0"
如果不想引入tokio全量特性,把runtime换成async-std或者smol也行,nmrs对异步运行时没有硬性要求,因为底层的zbus通过启动后台线程处理D-Bus通信,这种设计天然兼容不同的异步运行时,不需要手动管理executor。v3.0开始强化了VPN支持,如果你需要WireGuard和OpenVPN的能力,把nmrs默认开启的vpn feature保留就好;不碰VPN的话可以直接default-features = false来精减依赖树。扫描并列出可用Wi-Fi网络,这事用nmrs实现只需要几行。初始化NetworkManager实例之后,直接调list_networks(None),后面接一个简单的for循环:use nmrs::NetworkManager;#[tokio::main]async fn main() -> nmrs::Result<()> { let nm = NetworkManager::new().await?; let networks = nm.list_networks(None).await?; for net in networks { println!( "{} - Signal: {}%, Security: {:?}", net.ssid, net.strength.unwrap_or(0), net.security ); } Ok(())}
这个方法返回每个网络的SSID、信号强度百分比和安全类型。这里提一句,list_networks的参数用来限制扫描的接口名,传None表示在所有无线网卡上扫。连接到WPA2/WPA3无线网络也是一个样板级的调用。先说明白,nmrs本身的WifiSecurity枚举封装了三种常见情况:开放网络(WifiSecurity::None)、WPA预共享密钥(WpaPsk)、企业认证(WpaEap)。下面这段用了预共享密钥:use nmrs::{NetworkManager, WifiSecurity};#[tokio::main]async fn main() -> nmrs::Result<()> { let nm = NetworkManager::new().await?; nm.connect( "MyNetwork", None, WifiSecurity::WpaPsk { psk: "password123".into(), }, ) .await?; if let Some(ssid) = nm.current_ssid().await { println!("Connected to: {}", ssid); } Ok(())}
连接成功后通过current_ssid()取当前活跃的SSID。要想把nmrs真正用顺,必须先吃透它的错误处理。nmrs的每个网络操作返回的都是特定错误变体,不能直接用那种笼统的Box直接吞掉。四个最常见的ConnectionError类型:AuthFailed(密码错误)、NotFound(SSID不符或不在范围)、Timeout(超时)、以及一个通配的Error分支。下面代码块展示了这四态分支的处理模板,基本拿来就能套在所有连接逻辑里:use nmrs::{NetworkManager, WifiSecurity, ConnectionError};#[tokio::main]async fn main() -> nmrs::Result<()> { let nm = NetworkManager::new().await?; match nm .connect( "MyNetwork", None, WifiSecurity::WpaPsk { psk: "wrong_password".into(), }, ) .await { Ok(_) => println!("Connected successfully"), Err(ConnectionError::AuthFailed) => { eprintln!("Authentication failed - wrong password") } Err(ConnectionError::NotFound) => { eprintln!("Network not found or out of range") } Err(ConnectionError::Timeout) => { eprintln!("Connection timed out") } Err(e) => eprintln!("Error: {}", e), } Ok(())}
这么一层层Match是写Rust的正常展开,用惯了就是天然的控制流。除了基本Wi-Fi操作,2026年4月26号发布的v3.0.0是nmrs项目以来最大的一次更新。首先,OpenVPN和WireGuard支持通过nm.vpn_connect()和nm.vpn_disconnect()API正式提供,同时对已经存盘的NetworkManager VPN配置也能直接枚举和控制。scoping机制允许调用方按接口名过滤Wi-Fi操作,而不是总在全网卡范围上进行——这对多网卡设备和虚拟机上跑测试比较有意义。其次,新增了保存连接的CRUD管理、per-BSSID形式的接入点发现,飞行模式和rfkill状态查询、网络连通性和captive portal报告,以及一个NetworkManager secret agent的API,可以用来在连接凭据需要时自动弹出密码输入。这些新增功能基本包圆了你日常操作所涉及的所有东西,覆盖度比nmcli脚本化的工具链要完整很多,而且因为是类型安全和async-first的,不会遇到那种写Bash时管道一掉就静默失败的问题。有一点值得顺带提一下:nmrs-gui这个桌面程序。如果说nmrs库可以直接让你的Rust项目以高性能的方式控制网络,那nmrs-gui就是把这种友好的接口延续到了普通用户端——纯GTK4构建,脱离nmcli依赖,原生Wayland支持,自带多种主题和CSS自定义能力,不管你是用Hyprland还是Sway,都不会出现缩放错误或窗口管理灾难。从openSUSE到Arch Linux都有人打包了它的应用入口,用的人也越来越杂,从纯Rust开发者变成了同时包括平铺桌面普通用户的混合社区。退一步看nmrs的技术取舍,它不搞nmcli那种字符串处理,反而采用zbus直接通过D-Bus代理操作NetworkManager,带来了两方面具体的质变。其一,响应是事件驱动的——nmrs内部注册了D-Bus信号监视而非定期轮询,信号一到,状态立即更新,这对实时性要求高的应用(比如车载Linux网络仪表盘或工业终端)大大降低了处理器空转。其二,zbus后台线程的设计让nmrs能干净地拆离异步运行时的依赖,不跟特定的executor捆绑。这意味着从嵌入式到服务器场景,你不用因为换了个运行时就要重构网络层。跟市面上已有的几个解决方案比,nmrs的定位非常明确。对开发者来说,那些需要将网络管理内嵌进守护进程、系统托盘程序或者OpenWRT风格自研路由固件的场合,nmrs优势明显——核心库只靠D-Bus和zbus工作,没有GObject那套依赖树的拖累。对普通用户来说,nmrs-gui提供了一个比nm-applet更现代、更轻量的替代选择。如果你想找类似功能而跨平台的库,那nmrs不适合,它不可搬迁到macOS或Windows,这个就跟NetworkManager本身的天然约束一致,不值得当作缺点,倒是把跨平台的活交给更通用的网络抽象层更合理。nmrs是不是“完美的”网络管理绑定?远不是。VPN的实现目前还在刷版本号打磨边缘场景,per-BSSID AP发现和secret agent这些新货需要等更多人踩过坑才能把最佳实践沉淀下来。但nmrs v3.0给你的是一个比任何脚本工具都更靠近类型安全和并发模型最优解的方案,它让你在Linux上做网络管理的代码和写任何Rust核心逻辑的价格一样低——这个价值是那些依赖C语言D-Bus绑定或nmcli解析的传统方案很难打开的。