适用于 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 引入的),并写明推理过程。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)
| 仪表盘 | 拓扑 |
|---|---|
![]() | ![]() |
| Traceroute | Wi-Fi |
|---|---|
![]() | ![]() |
macOS
| 仪表盘 | Traceroute |
|---|---|
![]() | ![]() |
traceroute 二进制文件,traceroute 也始终通过主机 shim 在 PATH 中解析,因此工作进程永远不会回退到 tracepath,导致追踪立即完成,既没有跃点也没有显示错误。现在,只要 traceroute 完全没有产生可解析的输出,无论失败原因为何,它都会回退到 tracepath。DISPLAY/WAYLAND_DISPLAY(任何 GUI 会话)且 ssh 没有干净的 tty 时,它可能会尝试使用 $SSH_ASKPASS 来处理密码提示,而不是嵌入式终端——如果没有安装 askpass 辅助程序,认证会静默失败。现在 SSH_ASKPASS_REQUIRE=never 会强制密码提示始终通过终端本身进行。flatpak-spawn --host 转发的进程永远无法成为所转发 pty 的控制终端所有者(TIOCSCTTY 被拒绝并返回 EPERM——另一个不相关的会话已经拥有它;这是内核有意的安全边界,而非 bug)。唯一可行的变通方案(,分配一个新的 pty)能修复密码提示,但会破坏该会话的实时终端调整大小传播——这被认为比完全不提供 Flatpak 更差的权衡。AUR 和 AppImage 是今后受支持的 Linux 安装途径。packaging/flatpak/ 下的本地构建清单面向 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——而是像 AppImage 一样,使用 packaging/flatpak/build-bundle.sh 构建一个 .flatpak 包并附加到每次发布中。已在 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 内置。bootstrap_macos.sh 不再对 Homebrew 安装程序强制设置 NONINTERACTIVE=1,此前该设置会在任何全新管理员账户上立即中止,而不是提示输入 sudo 密码;文档中的一行命令现在会先下载脚本,而不是直接通过管道传给 bash,因为嵌套的交互步骤(Xcode CLT 安装程序、Homebrew 自身的 sudo 提示)在通过管道传输时会干扰外部脚本自身的输入流。SmbNfsPage 是 v1.7.0 发布的模块间右键系统中唯一缺失的目标页面;现在右键单击主机并选择 SMB 会预填主机字段并立即启动扫描,当检测到 445 端口开放时菜单项显示为粗体。system_profiler(未开启定位服务时返回 <redacted>)切换为 CoreWLAN;应用现在会在首次启动时请求定位服务权限;获得授权后,Wi-Fi 页面会显示所有网络及其真实名称。system_profiler。set_target + 自动查询)、DNS(仅 set_target 预填)、Ping(set_target + 自动开始)、Traceroute(set_target + 自动开始)、MTR(set_target + 自动开始)、端口扫描器(set_target + 聚焦)、SSH / RDP / VNC(set_target 打开预填好的新建连接表单)、拓扑(load_hosts 直接注入 IP 扫描器/Nmap 扫描的节点而无需重新扫描——自动检测网关、绘制连线、源节点以红色高亮)、资产清单(prefill_hosts 直接对发现的主机启动凭据扫描,跳过 ICMP 发现阶段)exec() 进入 Python 后,NSBundle.mainBundle() 会解析为 Qt 在 QApplication 构造期间读取的 Python.framework bundle(CFBundleName = "Python");通过修补 bundle 的 infoDictionary() 并在应用程序菜单创建之前通过 AppKit 重命名原生菜单项来修复。pyobjc-framework-Cocoa 使用 NSProcessInfo.setProcessName_ 修复菜单栏(已被 v1.6.4 取代)。install_macos_app.sh 中的 bash 启动脚本替换为编译的 C 存根,使 macOS 正确地将 .app bundle 与运行中的进程关联;添加了 setprogname 和 sys.argv[0] 覆盖作为回退方案。|;无管理员权限的完整回退链:操作系统通过 ver,CPU 通过注册表,内存通过 systeminfo,磁盘通过 wmic → fsutil(区分区域设置:EN 逗号 / FR 空格)→ dir /-C/System/Volumes/Data)、Apple Silicon CPU 回退(hw.model)、Synology(/volume1)、Unraid(/mnt/user)sshpass、nmap 和 snmpget 现在可以通过其绝对路径找到并调用;macOS 上的 .app bundle 不会继承 Homebrew 的 PATH(/opt/homebrew/bin、/usr/local/bin),因此之前安装的工具会被静默忽略。git pull && bash packaging/install_macos_app.sh 现在是文档记录的升级方法;该脚本管理自己的 venv(~/.local/share/nmlinux/venv),不需要系统级的 pip 或 pipx。free -h 替换为兼容 BusyBox 的 free;macOS 代码路径现在使用 sw_vers 获取操作系统名称,Apple Silicon CPU 使用 hw.model 回退,APFS 用户数据卷使用 /System/Volumes/Data;在根目录之前检测 Synology/Unraid 卷(/volume1、/mnt/user);使用 test -d 守卫修复了 df | tail -1 || … 的假成功模式;lsb_release 输出去除周围引号;支持多组 SSH/WinRM 凭据(对每台主机按顺序依次尝试)。tftpyssl.SSLError 子类;后台检查运行时条目现在显示"…(检查中)",当主机无法访问时显示"—(不可达)"。+ Watch(使用当前主机/端口)或在面板中手动添加主机;启动 2 秒后自动运行后台检查;侧边栏"TLS Inspector"条目显示彩色圆点:任一证书过期显示红色,任一证书将在 30 天内过期显示橙色;面板中有重新检查按钮;列表按条目显示状态(✓ / ⚠ / 已过期)并带颜色编码。_arp_entry() 现在在 macOS 上调用 arp -n <ip> 并解析其输出格式(? (IP) at AA:BB:CC on en0),而不是读取 /proc/net/arp(仅限 Linux);扫描器的四列现在都能在 macOS 上正确填充。getent(仅限 Linux)替换为 Python 的 socket.gethostbyaddr(),以实现跨平台的反向 DNS 解析;主机名查找现在无需任何额外工具即可在 macOS 上原生运行smbclient(需要 Homebrew samba)切换到 smbutil view(macOS 内置工具);SMB 共享列表现在无需任何安装即可在 macOS 上运行showmount 在 macOS 上是内置的,但不支持 --no-headers;在 macOS 上移除该标志,解析器跳过标题行;NFS 导出列表现在可原生运行xfreerdp 时,回退到 open rdp:// URL 方案;如果安装了 Microsoft Remote Desktop(App Store),则打开它,并预填主机、端口、用户名和域vncviewer 时,回退到 open vnc:// URL 方案;打开 macOS 屏幕共享(内置,零安装)ssh 命令添加 -A;允许在不复制私钥的情况下在服务器之间跳转(PC → A → B);需要活动的 SSH agent(SSH_AUTH_SOCK);所有 8 种语言的上下文帮助已更新pip install reportlab)printer、server、smartphone、cpu、laptop)avahi-browse(可选,与 nmap 扫描并行运行)检测设备类型;识别打印机(_ipp._tcp、PDL Printer)、Android 手机和电视(_googlecast._tcp、_androidtvremote2._tcp)、Apple Mac(AirPlay TXT 中的 am=Mac16,x 型号)、NAS 设备(Synology 报告 model=Xserve)、KDE Connect 桌面;当 avahi 不可用时,回退到 MAC 厂商 OUI 和主机名启发式方法_IS_MACOS)并分支到原生 macOS 命令:route -n get default、ifconfig、scutil --dns、networksetup、system_profiler SPAirPortDataType、pfctl、netstat -ib;权限提升使用 osascript + with administrator privileges 而不是 pkexec;等宽字体使用 Menlo 而不是 Monospace? 徽章面板(描述、使用示例和等效 CLI 命令)现在涵盖每个模块的所有 8 种语言;此前 JA 和 ZH 回退到英语nav_hint_smb_nfs 和 nav_hint_hosts 键~/.ssh/ 中的所有密钥对(文件、类型、位数、注释、SHA256 指纹);生成 Ed25519 或 RSA 4096 密钥,可选用口令(不匹配检测,按类型自动命名);将公钥复制到剪贴板;通过内联终端中的 ssh-copy-id 部署到远程服务器,支持 stdin 输入密码提示;删除密钥对需确认;若 ~/.ssh/ 不存在则自动创建;国际化:fr / en / es / deopenssl s_client);适用于有效、过期和自签名证书;对于无法访问的主机提供友好的错误消息smbclient -L,可选凭据,显示共享名称 / 类型 / 注释;NFS 选项卡:showmount -e,显示导出路径和访问列表;检测缺失工具并给出特定发行版的安装说明/etc/hosts;带启用/禁用切换的表格,通过对话框添加/编辑/删除条目;按 IP 或主机名过滤;通过 pkexec cp 保存(polkit 认证对话框)~/.local/share/nmlinux/venv 中创建 venv,通过 apt 安装系统依赖,创建启动器和 .desktop 条目(修复 PEP 668 externally-managed-environment 错误)vncviewer(TigerVNC);与 macOS ARD 兼容(DH30 认证由 vncviewer 原生处理);密码从不存储;检测缺失 vncviewer 并给出特定发行版的安装说明xfreerdp 作为外部进程启动;连接时提示输入密码,从不存储;字段:主机、端口、用户名、域、分辨率、全屏;检测缺失 xfreerdp 并给出特定发行版的安装说明(Arch / Debian / Fedora)assets/icons/ 中;通过 QSvgRenderer 在运行时渲染;颜色为 #60a5fa;应用不再需要任何系统图标主题(Breeze、Adwaita、Papirus…)main.py 现在通过 gsettings 自动检测 GTK 图标主题并将其应用到 Qt;扩展了 Wi-Fi、Traceroute、Speed Test、Interfaces、Port Scanner、Firewall、MTR 的回退链;themed_icon() 现在在接受主题图标之前验证真实像素图是否存在qt6.qtsvg 添加到 QT_PLUGIN_PATH,以便 Qt 可以渲染 SVG 图标;themed_icon() 尝试 22/24/16/32/48 尺寸(Breeze 使用 22 px,而不是 24);当检测到 Nix 捆绑的图标集时,强制使用 breeze 主题;同时检查 /etc/xdg/kdeglobals 以获取系统级 KDE 配置mtr --report,解析文本输出,显示实时表格,包含每跳的丢包率、RTT 最近/平均/最佳/最差/抖动,按丢包严重程度着色;连续模式;CSV + TXT 导出curl + Cloudflare(speed.cloudflare.com)实现无依赖速度测试:下载(25 MB)、上传(10 MB)、ping 1.1.1.1;最多 5 次运行结果持久化到 JSON;历史折线图(下载/上传)/etc/nftables.conf 和 /etc/iptables/*.rules;通过 pkexec nft list ruleset 查看实时规则集;列:表 / 链 / 规则 / 端口 / 动作 / 注释;动作按颜色编码;实时筛选? 徽章;悬停时显示描述模块功能的工具提示;在侧边栏和内容区域之间添加了垂直分隔线core/theme.py,包含 is_dark()、color_ok()、color_err();自定义绘制组件(_Graph、_MapWidget)在绘制时读取调色板;所有硬编码的 Catppuccin Mocha 颜色已替换为语义化 Qt 调色板角色255.255.255.0)traceroute / tracepath 回退)getent/avahi/nmblookup 解析主机名;MAC 地址、厂商(IEEE OUI 39K 条目)、接口列;CSV/TXT 导出已更新首次公开发布 — 13 个模块:仪表盘、接口、Wi-Fi、子网计算器、DNS 查询、Ping 监视器、IP 扫描器、端口扫描器、Nmap、Whois、SNMP、SNTP/NTP、SSH。
Linux — 大多数工具在标准安装中已经存在:```bash
sudo pacman -S iproute2 networkmanager bind-tools nmap whois net-snmp iputils mtr curl
sudo apt install iproute2 network-manager dnsutils nmap whois snmp mtr-tiny curl
sudo dnf install iproute NetworkManager bind-utils nmap whois net-snmp-utils mtr curl
**macOS** — 通过 [Homebrew](https://brew.sh) 安装:```bash
# Required
brew install nmap mtr curl
# Optional — enable additional modules
brew install whois # WHOIS page
brew install net-snmp # SNMP page (snmpwalk / snmpget)
brew install samba # SMB scan with credentials (smbclient)
macOS 原生自带
ping、dig、traceroute、netstat、ifconfig、smbutil和route。networksetup和scutil是 macOS 内置工具,无需安装。IP Scanner 中的 OUI 厂商查询也无需安装——Wireshark 的manuf数据库会在首次使用时于后台自动下载并缓存在本地。
pip install pyte 或 sudo pacman -S python-pyte)pip install tftpy 或 sudo pacman -S python-tftpy)——文件传输模块yay -S nmlinux
所有依赖(PySide6、ptyprocess、pyte、nmcli……)都会自动处理。
### 选项 2 — NixOS / Nix
直接使用随附的 `flake.nix` 运行 — 无需系统级安装:```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
nix run .
或者进入开发环境:```bash nix develop python3 -m nmlinux.main
所有 Python 依赖(PySide6、ptyprocess、pyte、tftpy)和系统工具(nmcli、nmap、freerdp、vncviewer、mtr、avahi-browse…)都通过 Nix wrapper 自动提供。
### 选项 4 — AppImage(任何 Linux 发行版,无需安装)
从 [最新发布](https://github.com/thongor77/nmlinux/releases/latest) 下载 `NMLinux-x.y.z-x86_64.AppImage`:```bash
chmod +x NMLinux-*.AppImage
./NMLinux-*.AppImage
无需安装 — Python、Qt 和所有 NMLinux 模块都捆绑在一个文件中。
适用于任何带 glibc 2.17+ 的 x86_64 Linux(Ubuntu 16.04+、Fedora 26+、Arch、Mint 等)。
系统网络工具(
nmap、whois、mtr…)并未捆绑 — 请通过你的包管理器安装它们,对应的模块才能正常工作。请参阅下面的要求。
**最快方式 — 一行命令引导。**适用于完全空白的 Mac:安装 Xcode Command Line Tools、Homebrew、所有系统工具,然后是 NMLinux 本身。可安全地重新运行(会更新而不是重新安装):```bash curl -fsSL https://raw.githubusercontent.com/thongor77/nmlinux/main/packaging/bootstrap_macos.sh -o /tmp/bootstrap_macos.sh && bash /tmp/bootstrap_macos.sh
安装到系统目录(`/Applications`),而不是 `~/Applications`:```bash
curl -fsSL https://raw.githubusercontent.com/thongor77/nmlinux/main/packaging/bootstrap_macos.sh -o /tmp/bootstrap_macos.sh && bash /tmp/bootstrap_macos.sh --system
无需 Apple Developer 账户或付费公证——底层使用的仍是同一个开源
install_macos_app.sh,只是为你自动获取并运行。该脚本是简洁、可读的 bash;运行前可以随时打开/tmp/bootstrap_macos.sh查看,或直接在这里查看:packaging/bootstrap_macos.sh。采用“先下载再运行”(而非直接通过管道传给
bash)是有意为之:在新 Mac 上,该脚本会触发嵌套的交互式步骤(Xcode 命令行工具安装程序、Homebrew 自己的安装程序会询问你的sudo密码),这些步骤需要从终端读取输入——如果直接将脚本通过管道传给bash,这些嵌套提示可能会干扰脚本自身的输入流,导致其中途停止。通过下载文件运行则完全避免了这一问题。
手动安装 — 如果你更愿意自己逐步运行,或已经安装了 Homebrew:```bash
brew install nmap mtr curl
git clone https://github.com/thongor77/nmlinux.git cd nmlinux bash packaging/install_macos_app.sh
更新:`git pull && bash packaging/install_macos_app.sh`
卸载:`bash packaging/uninstall_macos.sh`
系统级安装(`/Applications`):`bash packaging/install_macos_app.sh --system`
该脚本会自动将以下 Python 包安装到 venv 中:
- `PySide6`, `ptyprocess`, `pyte`, `tftpy`
- `pyobjc-framework-Cocoa` — macOS 菜单栏、原生对话框
- `pyobjc-framework-CoreWLAN` — Wi-Fi SSID 扫描
- `pyobjc-framework-CoreLocation` — 获取 Wi-Fi 名称所需的“定位服务”权限
**macOS 26(Tahoe)上的 Wi-Fi:** 首次启动时,macOS 会请求“定位服务”权限——授予该权限即可显示 Wi-Fi 网络名称。该权限位于 *系统设置 › 隐私与安全性 › 定位服务* 下。
> 大多数模块无需修改即可在 macOS 上运行。RDP 回退到 `open rdp://`(Microsoft Remote Desktop),VNC 回退到 `open vnc://`(内置的“屏幕共享”)。连接管理器在 macOS 上功能有所缩减(`nmcli` 不可用)。
### 选项 6 — Debian / Ubuntu / Linux Mint(安装脚本)
> **Linux Mint / Ubuntu 用户注意:** `pip install` 在 Python 3.12+ 上会在系统范围内被阻止(PEP 668 — `externally-managed-environment`)。请使用随附的安装脚本——它会自动创建虚拟环境,并安装一个 `.desktop` 启动项。```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
bash install.sh
该脚本将:
apt 安装系统依赖(libgl1、python3-venv、freerdp、tigervnc…)~/.local/share/nmlinux/venv 中创建虚拟环境~/.local/bin/nmlinux 创建启动器.desktop 条目,使 NMLinux 出现在你的应用程序菜单中安装后,从终端运行 nmlinux,或从应用程序菜单启动它。
从最新发布版下载 .whl 并安装:```bash
pip install nmlinux-1.5.3-py3-none-any.whl
sudo apt install libgl1 libglib2.0-0 libdbus-1-3 freerdp2-x11 tigervnc-viewer
sudo apt install libgl1 libglib2.0-0 libdbus-1-3 freerdp3-x11 tigervnc-viewer
pipx install nmlinux-1.5.3-py3-none-any.whl
> **Ubuntu 26.04+ 注意事项:** `pipx` 需要先安装系统库(libGL 等)——上述命令已包含这些库。如果 `pipx install` 因 PySide6 构建错误而失败,请改用 **选项 4**(安装脚本),它会自动处理一切。
### 选项 8 — 从源码安装(Arch / Fedora / macOS)```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
pip install PySide6 ptyprocess pyte tftpy
python3 -m nmlinux.main
复制 .desktop 文件,使 NMLinux 出现在你的应用程序启动器中:```bash
cp data/nmlinux.desktop ~/.local/share/applications/
update-desktop-database ~/.local/share/applications/
然后如有需要,编辑文件中的 `Exec=` 路径。
---
## 运行```bash
./nmlinux.sh
# or, after pip install:
nmlinux
# or directly:
python3 -m nmlinux.main
nmlinux/ core/ i18n.py — Translation system (8 languages: fr/en/es/de/it/pt/ja/zh), tr(key) function icons.py — themed_icon(): 21 bundled Lucide SVG icons via QSvgRenderer theme.py — is_dark(), color_ok(), color_err(): runtime light/dark helpers settings.py — AppSettings dataclass, JSON persistence ssh.py — SshConnection dataclass, SshStore rdp.py — RdpConnection dataclass, RdpStore, find_xfreerdp() vnc.py — VncConnection dataclass, VncStore, find_vncviewer() terminal.py — SshWorker (QThread) + PTY via ptyprocess, emits raw bytes tls_watchlist.py — TlsWatchlist: background cert expiry checker, JSON persistence http_server.py — ThreadedHTTPServer: directory listing, GET/PUT/POST, port binding tftp_helper.py — TftpServerThread: tftpy wrapper, configurable port and root help_content.py — Module contextual help strings (all 8 languages) cli_bar.py — CliBar singleton: pedagogical CLI equivalent bar export_dialog.py — open_export_dialog(): QFileDialog with live extension update command_palette.py — CommandPalette (Ctrl+P): fuzzy search across 29 modules export_manager.py — collect_snapshot(), to_json/text/markdown/pdf, save_export() pages/ about.py — About page (credits, tools & services) bandwidth.py — Bandwidth Monitor: per-interface 60s graph, live stats connection_manager.py — Connection Manager: nmcli profiles, connect/disconnect/edit dashboard.py — Dashboard dns.py — DNS Lookup file_transfer.py — File Transfer: TFTP + HTTP server, live log, pkexec for port 69 firewall.py — Firewall Viewer: nftables + iptables parser, live via pkexec help_page.py — Contextual help overlay hosts.py — Hosts File: view/edit /etc/hosts, toggle entries, save via pkexec interfaces.py — Network Interfaces ip_scanner.py — IP Scanner mtr.py — MTR: mtr --report parser, live hop stats table, export nmap_scan.py — Nmap ping.py — Ping Monitor port_scanner.py — Port Scanner rdp.py — Remote Desktop: RDP profiles, launches xfreerdp settings.py — Settings page smb_nfs.py — SMB/NFS Browser: smbclient + showmount snmp.py — SNMP sntp.py — SNTP / NTP speedtest.py — Speed Test: curl + Cloudflare, history graph ssh.py — SSH page (connection manager + terminal) ssh_keys.py — SSH Key Manager: list/generate/deploy/delete key pairs subnet.py — Subnet Calculator terminal_view.py — TerminalView: pyte VT100 emulator + QPainter renderer tls.py — TLS Inspector + TLS Watchlist: cert details, background expiry monitor topology.py — Topology Map: nmap -sn, interactive graph, zoom/pan traceroute.py — Visual Traceroute: world map, geolocation, zoom/pan vnc.py — VNC: connection profiles, launches vncviewer whois.py — Whois wifi.py — Wi-Fi wol.py — Wake on LAN: magic packet, persistent host book assets/ icons/ — 21 bundled Lucide SVG icons (#60a5fa) world.geojson — Natural Earth 110m countries (map background) window.py — MainWindow (sidebar + QStackedWidget) main.py — Entry point
---
## 桌面环境兼容性
从 v1.2.7 开始,NMLinux 使用 21 个随附的 [Lucide](https://lucide.dev) SVG 图标,通过 `QSvgRenderer` 在运行时渲染。该应用不再依赖任何系统图标主题(Breeze、Adwaita、Papirus…),并可在 KDE、GNOME、XFCE 等桌面上正确显示。Qt 样式会自动适应当前运行的桌面环境。
---
## 限制
### Linux
完全支持——全部 29 个模块均可用。
### macOS
大多数模块开箱即用,因为它们依赖两个平台都可用的工具(`ssh`、`dig`、`ping`、`curl`、`nmap`、`openssl`…)。
**9 个模块需要显式的 macOS 适配**(在启动时通过双代码路径检测平台):Dashboard、Interfaces、Wi-Fi、Topology、Bandwidth、Firewall、Connection Manager、Hosts File、MTR——这些模块使用 macOS 原生命令(`ifconfig`、`networksetup`、`scutil`、`pfctl`、`system_profiler`…)而非 Linux 对应的命令。
**macOS 支持有限或不支持的模块:**
| 模块 | 状态 | 说明 |
|--------|--------|-------|
| **RDP** | ✓ macOS | 回退到 `open rdp://` → Microsoft Remote Desktop(App Store) |
| **VNC** | ✓ macOS | 回退到 `open vnc://` → 屏幕共享(内置,零安装) |
| **IP Scanner** | ✓ macOS | 使用 `socket.gethostbyaddr()`——原生 Python,无需额外工具 |
| **SMB** | ✓ macOS | 使用内置的 `smbutil view` 而非 `smbclient` |
| **NFS** | ✓ macOS | `showmount` 内置;头部解析已适配 |
| **Connection Manager** | ⚠ 受限 | 编辑/删除需要 `nmcli`(仅 Linux);列表视图可用 |
### 通用
- 无 root/polkit 集成——需要提升权限的工具(某些 Nmap 模式、原始套接字)必须使用 `sudo` 运行;在 macOS 上,权限提升使用 `osascript` + `administrator privileges`
- SSH 代理转发需要活动的 SSH 代理(`SSH_AUTH_SOCK`);在 macOS 上由系统自动处理,无需手动设置
---
## 致谢
- **[Anthropic](https://www.anthropic.com)** — Claude Code,用于构建此项目的 AI 助手
- 感谢作者,为项目提供愿景、测试与方向
---
## 支持项目
如果 NMLinux 对你有用,请考虑支持其开发:
- **PayPal** — [通过 PayPal 捐赠](https://www.paypal.com/donate/?business=JFQGY7NU3ANCN&no_recurring=0&item_name=Every+donation%2C+no+matter+how+small%2C+helps+me+keep+this+project+alive.+Thank+you%21%0A¤cy_code=EUR)
- **Bitcoin** — `bc1qspe0tky7552qas72wgn8w9dswr0dxlv24w39t6ztjqk3nz6kc5tqv753a4`
---
## 许可证
GPL-2.0——参见 [LICENSE](https://github.com/thongor77/nmlinux/blob/main/LICENSE)。
本项目是独立的重新实现。未使用或移植 NETworkManager 的任何代码。
script| Tool | 功能 | Linux | macOS |
|---|
xfreerdp / xfreerdp3 | 远程桌面(RDP) | Arch: freerdp · Ubuntu ≤24.04: freerdp2-x11 · Ubuntu 26.04+: freerdp3-x11 | 可选——回退到 Microsoft 远程桌面(open rdp://) |
vncviewer | VNC | Arch: tigervnc · Debian: tigervnc-viewer | 可选——回退到 macOS 屏幕共享(open vnc://,内置) |
nm-connection-editor | 从连接管理器编辑连接 | Arch: nm-connection-editor | —(改为打开系统偏好设置) |
traceroute | Traceroute 替代工具(默认使用 tracepath) | Arch: traceroute | 内置 |
mount.cifs (cifs-utils) | 从右键菜单挂载 SMB 共享 | Arch/Debian: cifs-utils | 内置(mount_smbfs) |
iperf3 | 速度测试——LAN 标签页 | Arch: iperf3 · Debian/Ubuntu: iperf3 | brew install iperf3 |