适用于 Linux 和 macOS 的统一网络工具包 — 检查、连接、诊断。
NMLinux 是一个单一、统一的 GUI,将 29 个网络模块汇集于一个窗口中:接口监控、Wi-Fi、DNS、SSH 终端、防火墙查看器、拓扑图、traceroute 等。使用 Python 和 PySide6(Qt 6)从零构建,支持 8 种界面语言,除标准系统工具外无外部依赖。
[!NOTE] NMLinux 与 Linux 系统守护进程
/usr/bin/NetworkManager(Red Hat/GNOME 的 NetworkManager)无关。 NMLinux 是一个使用 Python 和 PySide6 从零构建的独立项目。
使用 Claude Code(Anthropic)构建,并得到其作者的贡献。
NMLinux 是在 AI 辅助下构建的 — 具体来说是 Claude Code — 这一点在本仓库中没有任何隐藏。如今几乎所有严肃的软件项目都在其流程的某个环节使用 AI,无论它们是否承认。因此,“是否涉及 AI”并不是有趣的问题。有趣的问题是:当 AI 出错时,是否有任何机制能发现它?
如果你更愿意亲自验证而不是听我一面之词,以下是能做到这一点的东西:
pytest tests/ -v。纯逻辑测试加上少量真实的 Qt 控件测试(菜单、表格),没有把有趣的部分 mock 掉。docs/Decisions-Techniques.md — 每一个非显而易见的技术决策、被否决的替代方案,以及被发现并修复的 bug(包括 AI 引入的 bug),都写下了推理过程。docs/Architecture.md 和 docs/Carte-des-Modules.md — 代码的实际结构,与实际发布的版本保持同步。这些都不是因为 AI 不可信而存在的。它们存在是因为任何东西都不应在没有检查流程的情况下发布 — 包括手写的代码。评判输出结果及其验证方式,而不是帮助编写它的工具。
还是发现了 bug?这很有用,并不丢人 — 提交 issue。
GitHub Discussions 已开放 — 分享反馈、提出想法、提问,或者只是打个招呼。作者拥有 30 多年的基础设施和运维经验,构建这个工具是因为 Linux 也应该拥有优秀、免费且简单的软件。
Linux 截图来自 v1.2.7 — macOS 截图来自 v1.3.5。该应用现在有 29 个模块和 8 种界面语言(FR/EN/ES/DE/IT/PT/JA/ZH)。
Linux (KDE)
| Dashboard | Topology |
|---|---|
![]() | ![]() |
| Traceroute | Wi-Fi |
|---|---|
![]() | ![]() |
macOS
| Dashboard | Traceroute |
|---|---|
![]() | ![]() |
libpython3.14.so.1.0,针对 Arch Linux 开发机的 glibc 2.44 构建)仍然需要比 AppImageHub 目录的测试机(Ubuntu 22.04,glibc 2.35)更新的 glibc 符号,因此 AppImage 在启动时仍然崩溃。build-appimage.sh 现在改为在 ubuntu:22.04 容器内(通过 podman)构建 PyInstaller 包,而不是在宿主机上构建,这样每个内嵌的二进制文件都链接到 AppImage 需要支持的确切 glibc 版本。build-appimage.sh 直接从 Arch Linux 构建机的非常新的 glibc 中捆绑了共享库(libz.so.1、libstdc++.so.6、libX11.so.6、libfontconfig.so.1 等)。在较旧的发行版上,AppImage 在启动时立即崩溃(GLIBC_ABI_DT_RELR' not found),被 AppImageHub 目录的自动化测试捕获。这些库现在已从捆绑包中剥离,因此 AppImage 会回退到宿主系统自带的副本,这是 AppImage 的标准做法。traceroute 总是通过宿主 shim 在 PATH 上解析,即使宿主没有安装真正的 traceroute 二进制文件,因此 worker 从未回退到 tracepath,跟踪会立即完成,没有跳数,也没有显示错误。现在只要 traceroute 完全没有产生可解析的输出,无论失败原因是什么,它都会回退到 tracepath。DISPLAY/WAYLAND_DISPLAY(任何 GUI 会话)且 ssh 没有干净的 tty 时,它可能会尝试使用 $SSH_ASKPASS 进行密码提示,而不是使用内嵌终端 — 如果未安装 askpass 辅助程序,则会静默认证失败。SSH_ASKPASS_REQUIRE=never 现在强制密码提示始终通过终端本身进行。flatpak-spawn --host 中继的进程永远无法成为转发 pty 的控制终端所有者(TIOCSCTTY 被拒绝并返回 EPERM — 另一个不相关的会话已经拥有它;这是内核有意的安全边界,不是 bug)。唯一可行的变通方法(script,分配一个新的 pty)修复了密码提示,但破坏了该会话的实时终端尺寸调整传播 — 被判定为比完全不发布 Flatpak 更糟糕的权衡。AUR 和 AppImage 是今后受支持的 Linux 安装途径。packaging/flatpak/ 下的本地构建 manifest 面向 KDE Linux 和其他仅支持 Flatpak 的发行版。nmlinux 通过 shell 调用的宿主 CLI 工具(nmcli、pkexec、mount.cifs、ssh、nmap 等)通过 PATH 上的 flatpak-spawn --host shim 桥接,而不是逐个沙箱化;PySide6 来自 Flathub 的 io.qt.PySide.BaseApp,而不是 PyPI wheel。未发布到 Flathub — 而是使用 packaging/flatpak/build-bundle.sh 构建单个 .flatpak 捆绑包并附加到每个发布版本,与 AppImage 已有的方式相同。在 v1.7.12 中停止使用 — 见上文。Ctrl+Shift+C 或右键菜单复制;使用 Ctrl+Shift+V 粘贴(已有功能)。此前无法复制 — 根本不存在文本选择功能iperf3 测试。支持 TCP/UDP、IPv4/IPv6/自动,以及反向(下载)方向,UDP 测试会显示抖动/丢包。由 issue #6 建议iperf3 — 安装后启用 LAN 标签页;否则该标签页会显示横幅并保持禁用~/mnt/<host>_<share>),可从终端和任何其他应用使用 — 不是临时的浏览视图。仅限会话(无 fstab/systemd 持久化),凭据复用现有的用户/密码字段。Linux 使用 pkexec mount -t cifs 并配合受限权限的凭据文件(绝不通过 ps 暴露);macOS 直接使用 mount_smbfs。当服务器拒绝默认协商时(在较旧的 NAS 设备上很常见),自动使用较旧的 SMB 方言(vers=2.0)重试 — 两次尝试都在单个认证提示下通过专用辅助进程完成cifs-utils(Linux)用于 SMB 挂载;macOS 已内置