# NMLinux · v1.7.14 [](https://github.com/thongor77/nmlinux/releases/latest) [](https://www.python.org/) [](LICENSE) [](#installation) [](#features) [](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) [](#support-the-project) **适用于 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](https://claude.ai/code)(Anthropic)构建,并得到其作者的贡献。 --- ## 开发过程 NMLinux 是在 AI 辅助下构建的 — 具体来说是 [Claude Code](https://claude.ai/code) — 这一点在本仓库中没有任何隐藏。如今几乎所有严肃的软件项目都在其流程的某个环节使用 AI,无论它们是否承认。因此,“是否涉及 AI”并不是有趣的问题。有趣的问题是:当 AI 出错时,是否有任何机制能发现它? 如果你更愿意亲自验证而不是听我一面之词,以下是能做到这一点的东西: - **162 个测试** — `pytest tests/ -v`。纯逻辑测试加上少量真实的 Qt 控件测试(菜单、表格),没有把有趣的部分 mock 掉。 - **[`docs/Decisions-Techniques.md`](https://github.com/thongor77/nmlinux/blob/main/docs/Decisions-Techniques.md)** — 每一个非显而易见的技术决策、被否决的替代方案,以及被发现并修复的 bug(包括 AI 引入的 bug),都写下了推理过程。 - **[`docs/Architecture.md`](https://github.com/thongor77/nmlinux/blob/main/docs/Architecture.md)** 和 **[`docs/Carte-des-Modules.md`](https://github.com/thongor77/nmlinux/blob/main/docs/Carte-des-Modules.md)** — 代码的实际结构,与实际发布的版本保持同步。 - 每次发布前运行的 **i18n 一致性检查**,用于发现 8 种受支持语言中缺失的翻译键。 这些都不是因为 AI 不可信而存在的。它们存在是因为任何东西都不应在没有检查流程的情况下发布 — 包括手写的代码。评判输出结果及其验证方式,而不是帮助编写它的工具。 还是发现了 bug?这很有用,并不丢人 — [提交 issue](https://github.com/thongor77/nmlinux/issues)。 --- ## 社区 **[GitHub Discussions](https://github.com/thongor77/nmlinux/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 | |-----------|------------| |  |  | --- ## 更新日志 ### v1.7.14 — 2026-09-30 - **AppImage — 修复启动崩溃,第二次尝试**:v1.7.13 的修复(剥离捆绑的系统库)还不够 — 内嵌的 Python 解释器本身(`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 版本。 ### v1.7.13 — 2026-09-30 - **AppImage — 修复启动崩溃(不完整,见 v1.7.14)**:`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 的标准做法。 ### v1.7.12 — 2026-08-12 - **Traceroute — 修复**:在 Flatpak 下(v1.7.11,见下文 — 现已移除),`traceroute` 总是通过宿主 shim 在 `PATH` 上解析,即使宿主没有安装真正的 `traceroute` 二进制文件,因此 worker 从未回退到 `tracepath`,跟踪会立即完成,没有跳数,也没有显示错误。现在只要 `traceroute` 完全没有产生可解析的输出,无论失败*原因*是什么,它都会回退到 `tracepath`。 - **SSH 终端 — askpass 修复**:当设置了 `DISPLAY`/`WAYLAND_DISPLAY`(任何 GUI 会话)且 ssh 没有干净的 tty 时,它可能会尝试使用 `$SSH_ASKPASS` 进行密码提示,而不是使用内嵌终端 — 如果未安装 askpass 辅助程序,则会静默认证失败。`SSH_ASKPASS_REQUIRE=never` 现在强制密码提示始终通过终端本身进行。 - **移除 Flatpak 打包**:v1.7.11 中附带的本地 KDE Linux manifest 已停止使用。调查上述 SSH 密码提示 bug 时发现了一个内核级限制:通过 `flatpak-spawn --host` 中继的进程永远无法成为转发 pty 的控制终端所有者(`TIOCSCTTY` 被拒绝并返回 `EPERM` — 另一个不相关的会话已经拥有它;这是内核有意的安全边界,不是 bug)。唯一可行的变通方法(`script`,分配一个新的 pty)修复了密码提示,但破坏了该会话的实时终端尺寸调整传播 — 被判定为比完全不发布 Flatpak 更糟糕的权衡。AUR 和 AppImage 是今后受支持的 Linux 安装途径。 ### v1.7.11 — 2026-08-03 - **Flatpak 打包(KDE 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 中停止使用 — 见上文。** ### v1.7.10 — 2026-08-03 - **SSH 终端 — 修复**:修复了一个竞态条件,如果会话启动时终端控件的实际尺寸尚不可知,PTY 可能会以错误的(默认 24×80)尺寸启动,从而静默丢弃尺寸调整请求。这会使远程全屏应用(例如 Claude Code CLI、htop、vim)与实际窗口尺寸不同步,导致屏幕底部出现陈旧/残留文本,只有在新输出滚动经过时才会清除。由用户报告;通过真实交互式会话复现 ### v1.7.9 — 2026-08-02 - **SSH 终端 — 复制/粘贴**:用鼠标选择文本(点击拖动,高亮显示),使用 `Ctrl+Shift+C` 或右键菜单复制;使用 `Ctrl+Shift+V` 粘贴(已有功能)。此前无法复制 — 根本不存在文本选择功能 - **SSH 终端 — 多个同时会话**:SSH 页面现在将每个连接打开在各自的标签页中,而不是单个共享会话。重新连接到已保存的连接 — 即使是同一个连接两次 — 过去会终止活动会话而不打开可用的替代会话;现在每个连接操作都会打开一个新的独立标签页 ### v1.7.8 — 2026-07-14 - **Speed Test — 新的 LAN (iperf3) 标签页**:在现有的互联网速度测试之外,新增一个标签页,针对捆绑的公共服务器列表(26 个国家)或已保存的自定义服务器(例如组织内部服务器)运行仅客户端的 `iperf3` 测试。支持 TCP/UDP、IPv4/IPv6/自动,以及反向(下载)方向,UDP 测试会显示抖动/丢包。由 [issue #6](https://github.com/thongor77/nmlinux/issues/6) 建议 - **新的可选依赖**:`iperf3` — 安装后启用 LAN 标签页;否则该标签页会显示横幅并保持禁用 ### v1.7.6 — 2026-07-05 - **Asset Inventory — 右键刷新**:右键单击一个或多个已扫描的行(支持多选),选择“Refresh selected”即可就地重新扫描这些主机,而无需重新运行完整的网络扫描 - **Asset Inventory — SSH 认证失败反馈**:被拒绝的 SSH 登录现在会显示“SSH auth failed”,而不是静默失败,同时不会丢失 Nmap 检测到的主机名/操作系统基线 — 已在一台真实的 Synology NAS 上确认,其中 DSM 的 Auto Block 在先尝试了其他已配置的凭据集后拒绝了正确的密码 ### v1.7.5 — 2026-07-04 - **Ping Monitor — 已保存目标目录**:新的左侧面板可让你将 ping 目标(名称、主机、间隔)保存到持久列表中,这样正在监控的主机在应用重启后仍然保留,而无需重新输入。每个正在主动监控的行上的 ★ 按钮可在会话中的任意时刻将该主机保存到目录 — 无需在应用意外关闭前提前规划 - **Ping Monitor — “Start monitoring”**:选择一个已保存的目标,一键开始监控,复用其保存的间隔 ### v1.7.4 — 2026-07-04 - **Asset Inventory — 修复不一致的扫描结果**:存活检查发送单个 1 秒超时的 ping 且不重试,这可能会在扫描器自身的并发负载下(一次最多探测 40 台主机)或当 Wi-Fi 主机在信标之间短暂休眠时漏掉真实设备 — 已在一个真实子网上实时确认,同一范围的重复运行返回了不同的设备数量。该检查现在会在回退到 TCP 端口探测之前重试 ping - **Asset Inventory — 新的“Refresh empty”按钮**:扫描后,仅重新扫描未返回数据的 IP,而不是再次扫描整个范围;新发现的主机会合并到现有结果中 ### v1.7.3 — 2026-07-03 - **SMB — 从右键菜单挂载共享**:在 SMB 标签页中右键单击一个共享,选择 Mount/Unmount 将其挂载到稳定的本地路径(`~/mnt/<host>_<share>`),可从终端和任何其他应用使用 — 不是临时的浏览视图。仅限会话(无 fstab/systemd 持久化),凭据复用现有的用户/密码字段。Linux 使用 `pkexec mount -t cifs` 并配合受限权限的凭据文件(绝不通过 `ps` 暴露);macOS 直接使用 `mount_smbfs`。当服务器拒绝默认协商时(在较旧的 NAS 设备上很常见),自动使用较旧的 SMB 方言(`vers=2.0`)重试 — 两次尝试都在单个认证提示下通过专用辅助进程完成 - **新的可选依赖**:`cifs-utils`(Linux)用于 SMB 挂载;macOS 已内置 ### v1.7.2 — 2026-07-03 - **macOS 安装 — 修复在裸 Mac 上发现的两个引导 bug**:`bootstrap_macos.sh` 不再对 Homebrew 安装程序强制设置 `NONINTERACTIVE=1`,这会在任何全新的管理员账户上立即中止,而不是提示输入 sudo 密码;文档中的一行命令现在先下载脚本,而不是直接将其管道传给 `bash`,因为嵌套的交互式步骤(Xcode CLT 安装程序、Homebrew 自身的 sudo 提示)在管道传输时可能会干扰外层脚本自身的输入流 - **通用右键菜单 — 添加 SMB**:`SmbNfsPage` 是 v1.7.0 中发布的模块间右键系统中唯一缺失的目标页面;右键单击主机并选择 SMB 现在会预填主机字段并立即启动扫描,当检测到端口 445 开放时菜单中会以粗体显示 - **i18n — 翻译剩余的 Dashboard 字符串**:网关延迟标签、TLS Watchlist 卡片标题及其状态行仍然是硬编码的法语;现在已在全部 8 种界面语言中翻译 ### v1.7.1 — 2026-07-02 - **macOS 26 (Tahoe)** — Wi-Fi SSID 修复:从 `system_profiler`(在没有位置服务时返回 `<redacted>`)切换为 **CoreWLAN** 作为主要数据源;应用现在在首次启动时请求位置服务权限;一旦授予权限,Wi-Fi 页面会显示所有网络的真实名称 - **macOS** — Connection Manager:连接的 SSID 现在通过 CoreWLAN 读取,安全模式使用 `system_profiler` - **macOS** — SMB:当 NAS 需要凭据时显示清晰的“需要认证”消息;修复了来自 Homebrew smbclient 的虚假 smb.conf 警告 - **macOS** — 修复了首次位置服务权限对话框后退出时可能发生的崩溃 ### v1.7.0 — 2026-07-02 - **通用右键上下文菜单**,适用于每个包含 IP 或主机名的表格 — 无需复制粘贴即可在模块之间直接导航:右键单击任何发现的主机,选择 Ping、Scan ports、Whois、DNS、Traceroute、MTR、SSH、RDP、VNC、View in Topology 或 Add to Inventory。当检测到相应端口开放时,菜单项 SSH/RDP/VNC 会以**粗体**显示。标签已在全部 8 种界面语言中完整翻译。 - **源页面**(发出右键操作):IP Scanner、Nmap、Ping、Port Scanner、Traceroute、MTR、Topology(节点右键) - **目标页面**(接收主机并预填):Whois(`set_target` + 自动查询)、DNS(`set_target` 仅预填)、Ping(`set_target` + 自动启动)、Traceroute(`set_target` + 自动启动)、MTR(`set_target` + 自动启动)、Port Scanner(`set_target` + 聚焦)、SSH / RDP / VNC(`set_target` 打开预填的新连接表单)、Topology(`load_hosts` 从 IP Scanner/Nmap 扫描注入节点而无需重新扫描 — 自动检测网关、绘制边、源节点以红色高亮)、Asset Inventory(`prefill_hosts` 直接在发现的主机上启动凭据扫描,跳过 ICMP 发现阶段) - **Dashboard — 网关 ping 图**:每 2 秒更新的实时延迟迷你图;颜色编码(<20 ms 绿色 / 20–100 ms 橙色 / >100 ms 红色 / 超时红色) - **Dashboard — TLS Watchlist 摘要**:Dashboard 中的状态卡片自动反映 TLS Watchlist 状态(OK / 即将过期 / 警报),无需重新查询 - **Dashboard — 地理地图调整大小**:窗口调整大小时世界地图现在会水平扩展 ### v1.6.4 — 2026-06-28 - **macOS**:菜单栏现在显示 **NMLinux** 而不是 **Python** — 根本原因:在 `exec()` 进入 Python 后,`NSBundle.mainBundle()` 解析为 Qt 在 QApplication 构造期间读取的 `Python.framework` 捆绑包(CFBundleName = "Python");通过修补捆绑包的 `infoDictionary()` 并在创建应用程序菜单之前通过 AppKit 重命名原生菜单项来修复 ### v1.6.3 — 2026-06-28 - **macOS**:首次尝试使用 `pyobjc-framework-Cocoa` 的 `NSProcessInfo.setProcessName_` 修复菜单栏(已被 v1.6.4 取代) ### v1.6.2 — 2026-06-28 - **macOS**:在 `install_macos_app.sh` 中用编译的 C stub 替换 bash 启动器脚本,以便 macOS 正确地将 `.app` 捆绑包与正在运行的进程关联;添加了 `setprogname` 和 `sys.argv[0]` 覆盖作为回退 ### v1.6.1 — 2026-06-25 - **SSH 终端 — 修复远程回显**:在内嵌 SSH 终端中键入的按键被发送到远程 shell,但从未回显回来(登录后键盘看起来“死了”)。nmlinux 强制关闭本地 PTY 回显,而 ssh 通过其终端模式(pty-req)将这种“无回显”传播到远程 pty,因此远程 shell 停止回显输入。在一个全新的 Ubuntu 26.04 VM 上复现(较新的 OpenSSH 会忠实应用这些模式)。终端现在保持 PTY 处于正常模式,让 ssh 管理回显,与真实终端模拟器一致。 ### v1.6.0 — 2026-06-24 - **Asset Inventory — WinRM Windows(完成)**:当 ICMP 被 Windows 防火墙阻止时,通过 TCP 端口探测进行主机检测;PowerShell 现在使用完整绝对路径 + **EncodedCommand (base64)** 以防止 cmd.exe 解释管道符 `|`;无管理员权限的完整回退链:操作系统通过 `ver`,CPU 通过注册表,RAM 通过 `systeminfo`,磁盘通过 `wmic` → `fsutil`(区域感知 EN 逗号 / FR 空格)→ `dir /-C` - **Asset Inventory — 多凭据 SSH**:支持多个 SSH 凭据集;修复 macOS 磁盘(`/System/Volumes/Data`)、Apple Silicon CPU 回退(`hw.model`)、Synology(`/volume1`)、Unraid(`/mnt/user`) - **Bug 修复**:WinRM 错误现在显示在表格中,而不是静默回退;WinRM/SNMP 主机检测不再因存在 SSH 凭据而被阻止;修正了 pywinrm 超时 ### v1.5.3 — 2026-06-24 - **macOS .app — Homebrew 工具检测**:通过 Homebrew 安装的 `sshpass`、`nmap` 和 `snmpget` 现在可以使用其绝对路径找到并调用;macOS 上的 `.app` 捆绑包不会继承 Homebrew 的 PATH(`/opt/homebrew/bin`、`/usr/local/bin`),因此以前安装的工具会被静默忽略 - **macOS 更新路径**:从仓库根目录运行 `git pull && bash packaging/install_macos_app.sh` 现在是文档化的升级方法;该脚本管理自己的 venv(`~/.local/share/nmlinux/venv`),不需要系统级 `pip` 或 `pipx` ### v1.5.2 — 2026-06-24 - **Asset Inventory** — 新模块(第 29 个);扫描 CIDR 范围并通过 SSH、WinRM、SNMP 或 Nmap 从每台主机收集操作系统、CPU、RAM、磁盘和运行时间;支持每种协议多个凭据集(按顺序尝试每个);零保留策略:凭据绝不写入磁盘,扫描后从内存中清除;将结果导出为 JSON、CSV 或 Markdown;在 Dashboard IP Geolocation 部分添加了动画地理地图 - **SSH 收集修复**:修复了磁盘命令 awk 引号错误;将 `free -h` 替换为 BusyBox 兼容的 `free`;macOS 代码路径现在使用 `sw_vers` 获取操作系统名称,Apple Silicon CPU 使用 `hw.model` 回退,APFS 用户数据卷使用 `/System/Volumes/Data`;在 root 之前检测 Synology/Unraid 卷(`/volume1`、`/mnt/user`);使用 `test -d` 防护修复了 `df | tail -1 || …` 的假成功模式;`lsb_release` 输出去除周围的引号;支持多个 SSH/WinRM 凭据集(每台主机按顺序尝试每个) ### v1.5.0 — 2026-06-17 - **File Transfer Server** — 新模块,可直接从应用启动/停止轻量级 TFTP 或 HTTP 服务器;经典用例:备份和恢复路由器、交换机或打印机配置;一次只能有一个服务器处于活动状态(TFTP 或 HTTP),可配置端口和根目录,本地 IP 显示为复制到剪贴板按钮;HTTP 包含目录列表(可从 LAN 上的任何浏览器浏览)、GET(下载)和 POST/PUT(上传);TFTP 支持 GET 和 PUT(双向),端口 69 需要 root — 应用在权限错误时显示“Start as root (pkexec)”按钮;实时传输日志表(时间戳、文件名、客户端 IP、方向 ↑/↓、大小);端口遍历保护;8 种界面语言;新依赖:`tftpy` ### v1.4.3 — 2026-06-14- **TLS 监视列表修复**:自签名和不受信任的证书现在正确显示为“⚠ 无效 / 不受信任的证书”(橙色),而不是绿色;SSL 异常捕获范围已扩大,以覆盖所有 `ssl.SSLError` 子类;条目现在在后台检查运行时显示“…(检查中)”,当主机无法访问时显示“—(无法访问)” ### v1.4.2 — 2026-06-14 - **TLS 监视列表** — 用于监控证书过期的主机名持久列表;使用 `+ Watch`(使用当前主机/端口)或在面板中手动添加主机;后台检查在启动后 2 秒自动运行;侧边栏“TLS Inspector”条目显示彩色圆点:如果有任何证书已过期则显示红色,如果有任何证书将在 30 天内过期则显示橙色;面板中有重新检查按钮;列表显示每个条目的状态(✓ / ⚠ / EXPIRED)并带有颜色编码 ### v1.4.1 — 2026-06-14 - **macOS — IP 扫描器**:修复了 macOS 上的 MAC 地址、厂商和接口查找;`_arp_entry()` 现在在 macOS 上调用 `arp -n <ip>` 并解析其输出格式(`? (IP) at AA:BB:CC on en0`),而不是读取 `/proc/net/arp`(仅限 Linux);四个扫描器列现在在 macOS 上都能正确填充 - **VNC 帮助**:在所有 8 种语言中添加了一条说明,阐明 Linux 默认没有 VNC 服务器,并列出常见的安装选项(x11vnc、tigervnc-server、wayvnc) ### v1.4.0 — 2026-06-14 - **macOS — IP 扫描器**:将 `getent`(仅限 Linux)替换为 Python 的 `socket.gethostbyaddr()`,以实现跨平台反向 DNS 解析;主机名查找现在可在 macOS 上原生运行,无需任何额外工具 - **macOS — SMB 浏览器**:从 `smbclient`(需要 Homebrew samba)切换为 `smbutil view`(macOS 内置工具);SMB 共享列表现在可在 macOS 上运行,无需任何安装 - **macOS — NFS 浏览器**:`showmount` 在 macOS 上是内置的,但不支持 `--no-headers`;在 macOS 上移除了该标志,解析器中跳过标题行;NFS 导出列表现在可原生运行 - **macOS — RDP**:当找不到 `xfreerdp` 时,回退到 `open rdp://` URL scheme;如果已安装,则打开 Microsoft Remote Desktop(App Store),并预填主机、端口、用户名和域 - **macOS — VNC**:当找不到 `vncviewer` 时,回退到 `open vnc://` URL scheme;打开 macOS 屏幕共享(内置,零安装) ### v1.3.9 — 2026-06-13 - **SSH agent forwarding** — SSH 连接表单中新增“Agent forwarding”复选框;向 `ssh` 命令添加 `-A`;允许在服务器之间跳转而无需复制私钥(PC → A → B);需要活动的 SSH agent(`SSH_AUTH_SOCK`);上下文帮助已在所有 8 种语言中更新 ### v1.3.8 — 2026-06-13 - **命令面板(Ctrl+P)** — 可即时通过键盘导航到 27 个模块中的任意一个;按名称和关键词进行模糊搜索(例如“firewall”、“tls”、“ssh key”、“scan”);使用上/下箭头 + Enter 或单击进行导航;可在应用中的任意位置通过 Ctrl+P 打开 - **导出管理器** — 从 File → Export Network Report… 导出完整的网络快照(接口、路由、DNS 解析器),支持 JSON、Markdown、纯文本或 PDF(可选:`pip install reportlab`) - **模块级导出按钮** — 为 Interfaces、DNS、Firewall、SSH Connections 和 Connection Manager 页面添加了导出按钮;每个页面以所选格式导出其当前数据,并在格式过滤器更改时实时更新文件名扩展名 ### v1.3.6 — 2026-06-12 - **拓扑 — 设备图标** — 每个节点现在显示与其设备类型匹配的 Lucide SVG 图标(路由器/wifi、计算机/笔记本电脑、打印机、NAS/服务器、智能手机、网络交换机、Raspberry Pi),而不是通用圆圈;新增 5 个捆绑 SVG 图标(`printer`、`server`、`smartphone`、`cpu`、`laptop`) - **拓扑 — mDNS 检测** — 通过 `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 和主机名启发式判断 - **拓扑 — 详情面板** 显示检测到的设备类别(Printer、Smartphone、NAS…),而不是通用的“Host”标签;支持所有 8 种语言的 i18n - **Traceroute — 自动缩放** — 世界地图在每条路由结束时自动缩放并居中到已地理定位跳点的边界框;当用户手动平移或缩放时禁用;在下一次 traceroute 时恢复;右键单击重置为完整世界视图 ### v1.3.5 — 2026-06-06 - **macOS 兼容性** — 所有 9 个网络模块现在都能在 macOS 上运行,且不破坏 Linux 行为;每个模块在启动时检测平台(`_IS_MACOS`)并分支到原生 macOS 命令:`route -n get default`、`ifconfig`、`scutil --dns`、`networksetup`、`system_profiler SPAirPortDataType`、`pfctl`、`netstat -ib`;权限提升使用 `osascript` + `with administrator privileges`,而不是 `pkexec`;等宽字体使用 `Menlo`,而不是 `Monospace` - **具有 Linux/macOS 双路径的模块**:Dashboard、Interfaces、Wi-Fi、Topology、Bandwidth、Firewall(pf.conf + pfctl)、Connection Manager、Hosts File、MTR - **未更改的模块**(两个平台上工具相同):DNS、Nmap Scan、SNMP、Whois ### v1.3.2 — 2026-06-06 - **i18n 扩展到 8 种语言** — 新增 Italiano、Português、日本語(Japanese)和中文(Chinese Simplified);完整 UI(全部 27 个模块,约 720 个翻译键)现在支持 FR / EN / ES / DE / IT / PT / JA / ZH;在 Settings 中更改语言后会显示重启提示 - **8 种语言的上下文帮助** — `?` 徽章面板(描述、用法示例和等效 CLI 命令)现在覆盖每个模块的所有 8 种语言;此前 JA 和 ZH 会回退到英语 - **错误修复** — SMB/NFS 和 Hosts File 的导航工具提示无论选择何种语言都显示法语;已将缺失的 `nav_hint_smb_nfs` 和 `nav_hint_hosts` 键添加到所有 7 个非法语语言块中 ### v1.3.1 — 2026-06-05 - **SSH 密钥管理器** — 列出 `~/.ssh/` 中的所有密钥对(文件、类型、位数、注释、SHA256 指纹);生成 Ed25519 或 RSA 4096 密钥,可选密码短语(不匹配检测,按类型自动命名文件);将公钥复制到剪贴板;通过 `ssh-copy-id` 在内联终端中部署到远程服务器,支持 stdin 以处理密码提示;删除密钥对并确认;如果缺失则自动创建 `~/.ssh/`;i18n:fr / en / es / de ### v1.3.0 — 2026-06-03 - **TLS / SSL Inspector** — 检查任意服务器的证书:subject CN、SANs、issuer、有效期(颜色编码:绿色 / 橙色 < 30 天 / 红色已过期)、序列号、TLS 协议、密码套件和证书链(通过 `openssl s_client`);适用于有效、已过期和自签名证书;对无法访问的主机提供友好的错误消息 - **SMB / NFS 浏览器** — 列出任意服务器的共享和导出;SMB 选项卡:`smbclient -L`,可选凭据,显示共享名称 / 类型 / 注释;NFS 选项卡:`showmount -e`,显示导出路径和访问列表;检测缺失工具并提供发行版特定的安装说明 - **Hosts 文件编辑器** — 查看和编辑 `/etc/hosts`;带有启用/禁用切换的表格,通过对话框添加/编辑/删除条目;按 IP 或主机名过滤;通过 `pkexec cp` 保存(polkit 身份验证对话框) - **install.sh** — 适用于 Debian / Ubuntu / Linux Mint 的新脚本:在 `~/.local/share/nmlinux/venv` 中创建 venv,通过 apt 安装系统依赖,创建启动器和 `.desktop` 条目(修复 PEP 668 `externally-managed-environment` 错误) ### v1.2.9 — 2026-05-30 - **VNC** — 用于管理 VNC 连接配置文件的新模块;像 SSH 和 RDP 一样支持组/子组;启动 `vncviewer`(TigerVNC);兼容 macOS ARD(DH30 认证由 vncviewer 原生处理);密码从不存储;检测缺失的 `vncviewer` 并提供发行版特定的安装说明 - **关于 — 工具与服务** — 新增部分,列出应用依赖的所有第三方工具和 API - **侧边栏 i18n** — 所有 23 个导航工具提示现在已翻译为 FR/EN/ES/DE(此前为硬编码法语);标签已更正:Topology、Connections、Subnet ### v1.2.8 — 2026-05-30 - **远程桌面(RDP)** — 用于管理 Windows RDP 连接配置文件的新模块;像 SSH 一样支持组/子组;将 `xfreerdp` 作为外部进程启动;连接时提示输入密码,从不存储;字段:主机、端口、用户名、域、分辨率、全屏;检测缺失的 `xfreerdp` 并提供发行版特定的安装说明(Arch / Debian / Fedora) ### v1.2.7 — 2026-05-26 - **捆绑 Lucide 图标** — 来自 [Lucide](https://lucide.dev)(MIT)的 21 个 SVG 图标现在捆绑在 `assets/icons/` 中;在运行时通过 `QSvgRenderer` 渲染;颜色为 `#60a5fa`;应用不再需要任何系统图标主题(Breeze、Adwaita、Papirus…) ### v1.2.6 — 2026-05-24 - **GNOME / Adwaita 兼容性** — 修复了非 KDE 桌面上的图标:`main.py` 现在通过 `gsettings` 自动检测 GTK 图标主题并将其应用于 Qt;扩展了 Wi-Fi、Traceroute、Speed Test、Interfaces、Port Scanner、Firewall、MTR 的回退链;`themed_icon()` 现在在接受主题图标之前验证真实 pixmap 是否存在 - **NixOS / KDE 兼容性** — 修复了 NixOS 上的所有图标:Breeze 6.x 仅提供 SVGZ 图标;Nix wrapper 现在将 `qt6.qtsvg` 添加到 `QT_PLUGIN_PATH`,以便 Qt 可以渲染 SVG 图标;`themed_icon()` 尝试尺寸 22/24/16/32/48(Breeze 使用 22 px,而不是 24);当检测到 Nix 捆绑的图标集时,主题强制为 `breeze`;还会检查 `/etc/xdg/kdeglobals` 以获取系统范围的 KDE 配置 ### v1.2.5 — 2026-05-23 - **MTR** — 嵌入式 My Traceroute:运行 `mtr --report`,解析文本输出,显示实时表格,包含每跳的 Loss %、RTT Last/Avg/Best/Worst/Jitter,并按丢包严重程度进行颜色编码;连续模式;CSV + TXT 导出 - **Speed Test** — 通过 `curl` + Cloudflare(`speed.cloudflare.com`)进行无依赖速度测试:下载(25 MB)、上传(10 MB)、ping `1.1.1.1`;最多 5 次运行结果持久化到 JSON;历史折线图(Download/Upload) - **防火墙查看器** — 只读规则集查看器:无需 root 即可解析 `/etc/nftables.conf` 和 `/etc/iptables/*.rules`;通过 `pkexec nft list ruleset` 获取实时规则集;列:Table / Chain / Rule / Port / Action / Comment;操作颜色编码;实时过滤 - **侧边栏提示** — 每个导航条目现在显示一个细微的 `?` 徽章;悬停时显示描述该模块功能的工具提示;在侧边栏和内容区域之间添加了垂直分隔线 - **i18n** — 所有新模块已翻译为法语、英语和西班牙语 ### v1.2.0 — 2026-05-22 - **主题适配** — 所有页面支持完整的运行时浅色/深色切换;新增 `core/theme.py`,包含 `is_dark()`、`color_ok()`、`color_err()`;自定义绘制控件(`_Graph`、`_MapWidget`)在绘制时读取调色板;所有硬编码的 Catppuccin Mocha 颜色已替换为语义化 Qt 调色板角色 - **子网掩码** — Dashboard、Interfaces 和 Connexions 页面现在显示从 CIDR 前缀派生的点分十进制子网掩码(例如 `255.255.255.0`) - **带宽监视器** — 显式的 Start/Stop 按钮取代了页面加载时不可靠的自动启动 - **导出 CSV/TXT** — Nmap 和 Traceroute 页面现在提供 Export CSV 和 Export TXT 按钮(在扫描/跟踪完成后出现) - **i18n** — 为上述所有功能新增翻译键(fr/en/es/de) ### v1.1.1 — 2026-05-16 - **SSH 终端** — 使用 [pyte](https://github.com/selectel/pyte)(VT100/xterm 模拟器)+ QPainter 渲染器完全重写;2000 行回滚、光标闪烁、256 色支持 - **可视化 Traceroute** — 世界地图(Natural Earth 110m)、每跳实时地理定位(ip-api.com)、交互式缩放/平移、双解析器(`traceroute` / `tracepath` 回退) --- [Read more](https://github.com/thongor77/nmlinux)