
nmlinux v1.7.11
适用于 Linux 的统一网络工具包 — Python 3 + PySide6
NMLinux · v1.7.12
适用于 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 出错时,是否有机制能发现它?
如果你更愿意自己验证而不是听我一面之词,以下是答案:
- 162 个测试 —
pytest tests/ -v。包含纯逻辑测试以及少量真实的 Qt 控件测试(菜单、表格),没有用 mock 绕过关键部分。 docs/Decisions-Techniques.md— 记录每一个不显而易见的技术决策、被否决的备选方案,以及发现并修复的 bug(包括由 AI 引入的),并写明推理过程。docs/Architecture.md和docs/Carte-des-Modules.md— 代码的实际结构,并与发布内容保持同步。- 每次发布前运行的 i18n 一致性检查,用于捕获 8 种受支持语言中缺失的翻译键。
这些机制的存在并非因为 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 |
|---|---|
![]() | ![]() |
更新日志
v1.7.12 — 2026-08-12
- Traceroute — 修复:在 Flatpak(v1.7.11,见下文——现已移除)下,即使主机没有安装真正的
traceroute二进制文件,traceroute也始终通过主机 shim 在PATH中解析,因此工作进程永远不会回退到tracepath,导致追踪立即完成,既没有跃点也没有显示错误。现在,只要traceroute完全没有产生可解析的输出,无论失败原因为何,它都会回退到tracepath。 - SSH 终端 — askpass 修复:当设置了
DISPLAY/WAYLAND_DISPLAY(任何 GUI 会话)且 ssh 没有干净的 tty 时,它可能会尝试使用$SSH_ASKPASS来处理密码提示,而不是嵌入式终端——如果没有安装 askpass 辅助程序,认证会静默失败。现在SSH_ASKPASS_REQUIRE=never会强制密码提示始终通过终端本身进行。 - 移除 Flatpak 打包:v1.7.11 中附带的本地 KDE Linux 清单已停止维护。调查上述 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/下的本地构建清单面向 KDE Linux 及其他仅支持 Flatpak 的发行版。nmlinux 通过 shell 调用的主机 CLI 工具(nmcli、pkexec、mount.cifs、ssh、nmap等)通过PATH上的flatpak-spawn --hostshim 进行桥接,而不是对每个工具单独进行沙箱化;PySide6 来自 Flathub 的io.qt.PySide.BaseApp,而非 PyPI wheel。未发布到 Flathub——而是像 AppImage 一样,使用packaging/flatpak/build-bundle.sh构建一个.flatpak包并附加到每次发布中。已在 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
- 速度测试 — 新增 LAN(iperf3)标签页:在现有的互联网速度测试之外,新标签页可针对内置的公共服务器列表(26 个国家)或已保存的自定义服务器(如组织内部服务器)运行仅客户端模式的
iperf3测试。支持 TCP/UDP、IPv4/IPv6/自动以及反向(下载)方向,UDP 测试会显示抖动/丢包。由 issue #6 建议。 - 新的可选依赖:
iperf3— 安装以启用 LAN 标签页;否则该标签页会显示提示横幅并保持禁用状态。
v1.7.6 — 2026-07-05
- 资产清单 — 右键刷新:右键单击一个或多个已扫描的行(支持多选),选择"刷新选中项"以只重新扫描这些主机,而无需重新运行完整的网络扫描。
- 资产清单 — SSH 认证失败反馈:SSH 登录被拒绝时现在会显示"SSH 认证失败",而不是静默失败,并且不会丢失 Nmap 检测到的主机名/操作系统基线——已在真实的 Synology NAS 上验证,该设备上的 DSM Auto Block 在尝试了其他已配置的凭据集后拒绝了正确密码。
v1.7.5 — 2026-07-04
- Ping 监控 — 已保存目标目录:新增的左侧面板可让您将 ping 目标(名称、主机、间隔)保存到持久化列表中,这样被监控的主机在应用重启后仍然保留,无需重新输入。每个正在监控的行上的 ★ 按钮可在会话期间随时将该主机保存到目录中——无需在应用意外关闭前提前规划。
- Ping 监控 — "开始监控":选择一个已保存的目标,一键开始监控,并复用其保存的间隔设置。
v1.7.4 — 2026-07-04
- 资产清单 — 修复扫描结果不一致:存活检查只发送一次超时 1 秒的 ping 且不重试,在扫描器自身并发负载下(一次最多探测 40 台主机)或 Wi-Fi 主机在信标之间短暂休眠时,可能会漏掉真实设备——已在一个真实子网上实时验证,同一范围重复运行返回的设备数量不同。该检查现在会在回退到 TCP 端口探测之前重试 ping。
- 资产清单 — 新增"刷新空项"按钮:扫描后,只重新扫描未返回数据的 IP,而无需再次扫描整个范围;新发现的主机会合并到现有结果中。
v1.7.3 — 2026-07-03
- SMB — 从右键菜单挂载共享:在 SMB 标签页中右键单击共享并选择"挂载/卸载",可将其挂载到稳定的本地路径(
~/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 — 剩余仪表盘字符串已翻译:网关延迟标签、TLS 监视列表卡片标题及其状态行之前仍是硬编码的法语;现在已在全部 8 种界面语言中完成翻译。
v1.7.1 — 2026-07-02
- macOS 26(Tahoe) — Wi-Fi SSID 修复:主要数据源从
system_profiler(未开启定位服务时返回<redacted>)切换为 CoreWLAN;应用现在会在首次启动时请求定位服务权限;获得授权后,Wi-Fi 页面会显示所有网络及其真实名称。 - macOS — 连接管理器:已连接的 SSID 现在通过 CoreWLAN 读取,安全模式仍使用
system_profiler。 - macOS — SMB:当 NAS 需要凭据时显示明确的"需要身份验证"消息;修复了 Homebrew smbclient 发出的虚假 smb.conf 警告。
- macOS — 修复了首次显示定位服务权限对话框后退出时可能崩溃的问题。
v1.7.0 — 2026-07-02
- 通用右键上下文菜单,出现在每个包含 IP 或主机名的表格上——无需复制粘贴即可在模块间直接跳转:右键单击任何发现的主机,然后选择 Ping、扫描端口、Whois、DNS、Traceroute、MTR、SSH、RDP、VNC、在拓扑中查看或添加到清单。当检测到相应端口开放时,SSH/RDP/VNC 菜单项会以粗体显示。标签在全部 8 种界面语言中均已完整翻译。
- 源页面(发出右键操作):IP 扫描器、Nmap、Ping、端口扫描器、Traceroute、MTR、拓扑(节点右键单击)
- 目标页面(接收主机并预填):Whois(
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 发现阶段) - 仪表盘 — 网关 ping 图表:实时延迟迷你图,每 2 秒更新一次;颜色编码(<20 毫秒绿色 / 20–100 毫秒橙色 / >100 毫秒红色 / 超时红色)
- 仪表盘 — TLS 监视列表摘要:仪表盘中的状态卡片自动反映 TLS 监视列表的状态(正常 / 即将过期 / 警报),无需重新查询。
- 仪表盘 — 地理地图尺寸调整:现在调整窗口大小时,世界地图会水平扩展。
v1.6.4 — 2026-06-28
- macOS:菜单栏现在显示 NMLinux 而不是 Python — 根本原因:在
exec()进入 Python 后,NSBundle.mainBundle()会解析为 Qt 在 QApplication 构造期间读取的Python.frameworkbundle(CFBundleName = "Python");通过修补 bundle 的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中的 bash 启动脚本替换为编译的 C 存根,使 macOS 正确地将.appbundle 与运行中的进程关联;添加了setprogname和sys.argv[0]覆盖作为回退方案。
v1.6.1 — 2026-06-25
- SSH 终端 — 修复远程回显:在嵌入式 SSH 终端中输入的按键会被发送到远程 shell,但永远不会回显(登录后键盘看起来就像"死"了一样)。nmlinux 强制关闭了本地 PTY 回显,ssh 通过其终端模式(pty-req)将"无回显"传播到远程 pty,导致远程 shell 停止回显输入。已在一台全新的 Ubuntu 26.04 虚拟机中复现(新版 OpenSSH 会忠实地应用这些模式)。终端现在让 PTY 保持正常模式,由 ssh 管理回显,与真实终端模拟器一致。
v1.6.0 — 2026-06-24
- 资产清单 — WinRM Windows(完整):当 ICMP 被 Windows 防火墙阻止时,通过 TCP 端口探测进行主机检测;PowerShell 现在使用完整绝对路径 + EncodedCommand(base64),防止 cmd.exe 解释管道符
|;无管理员权限的完整回退链:操作系统通过ver,CPU 通过注册表,内存通过systeminfo,磁盘通过wmic→fsutil(区分区域设置:EN 逗号 / FR 空格)→dir /-C - 资产清单 — 多凭据 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 上的.appbundle 不会继承 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
- 资产清单 — 新模块(第 29 个);扫描 CIDR 范围,通过 SSH、WinRM、SNMP 或 Nmap 从每台主机收集操作系统、CPU、内存、磁盘和运行时间;支持每种协议多组凭据(依次尝试);零保留策略:凭据从不写入磁盘,扫描后从内存中清除;结果可导出为 JSON、CSV 或 Markdown;仪表盘 IP 地理位置部分新增了动画地理地图。
- SSH 收集修复:修复了磁盘命令的 awk 引号错误;
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 凭据(对每台主机按顺序依次尝试)。
v1.5.0 — 2026-06-17
- 文件传输服务器 — 新模块,可直接从应用启动/停止轻量级 TFTP 或 HTTP 服务器;经典用例:备份和恢复路由器、交换机或打印机配置;同一时间只能激活一个服务器(TFTP 或 HTTP),可配置端口和根目录,本地 IP 显示为可复制到剪贴板的按钮;HTTP 支持目录列表(可从局域网中的任意浏览器浏览)、GET(下载)和 POST/PUT(上传);TFTP 支持 GET 和 PUT(双向),69 端口需要 root 权限——应用在权限错误时显示"以 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 天内过期显示橙色;面板中有重新检查按钮;列表按条目显示状态(✓ / ⚠ / 已过期)并带颜色编码。
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 Scanner:将 getent(仅限 Linux)替换为 Python 的 socket.gethostbyaddr(),以实现跨平台的反向 DNS 解析;主机名查找现在无需任何额外工具即可在 macOS 上原生运行
- macOS — SMB Browser:从
smbclient(需要 Homebrew samba)切换到smbutil view(macOS 内置工具);SMB 共享列表现在无需任何安装即可在 macOS 上运行 - macOS — NFS Browser:
showmount在 macOS 上是内置的,但不支持--no-headers;在 macOS 上移除该标志,解析器跳过标题行;NFS 导出列表现在可原生运行 - macOS — RDP:当找不到
xfreerdp时,回退到open rdp://URL 方案;如果安装了 Microsoft Remote Desktop(App Store),则打开它,并预填主机、端口、用户名和域 - macOS — VNC:当找不到
vncviewer时,回退到open vnc://URL 方案;打开 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
- Command Palette(Ctrl+P) — 即时键盘导航到 27 个模块中的任意一个;按名称和关键字进行模糊搜索(例如 "firewall"、"tls"、"ssh key"、"scan");使用上/下箭头 + Enter 或单击导航;在应用任意位置按 Ctrl+P 打开
- Export Manager — 从“文件 → 导出网络报告…”导出完整网络快照(接口、路由、DNS 解析器),格式为 JSON、Markdown、纯文本或 PDF(可选:
pip install reportlab) - Module-level export buttons — 在 Interfaces、DNS、Firewall、SSH Connections 和 Connection Manager 页面中添加了导出按钮;每个页面以所选格式导出当前数据,并在格式筛选器更改时实时更新文件扩展名
v1.3.6 — 2026-06-12
- Topology — device icons — 每个节点现在显示与其设备类型(路由器/无线、计算机/笔记本电脑、打印机、NAS/服务器、智能手机、网络交换机、树莓派)匹配的 Lucide SVG 图标,而不是通用圆点;新增 5 个捆绑 SVG 图标(
printer、server、smartphone、cpu、laptop) - Topology — mDNS detection — 通过
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 和主机名启发式方法 - Topology — detail panel 显示检测到的设备类别(打印机、智能手机、NAS…),而不是通用的“Host”标签;支持所有 8 种语言的国际化
- Traceroute — auto-zoom — 每次路由结束时,世界地图自动缩放并居中到已定位跃点的边界框;当用户手动平移或缩放时禁用;在下一次路由追踪时恢复;右键单击重置为全世界视图
v1.3.5 — 2026-06-06
- macOS compatibility — 所有 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 双路径的模块:仪表盘、接口、Wi-Fi、拓扑、带宽、防火墙(pf.conf + pfctl)、连接管理器、Hosts 文件、MTR
- 未更改的模块(两个平台上的工具相同):DNS、Nmap 扫描、SNMP、Whois
v1.3.2 — 2026-06-06
- 国际化扩展到 8 种语言 — 新增 Italiano、Português、日本語(日语)和中文(简体中文);完整 UI(全部 27 个模块,约 720 个翻译键)现支持 FR / EN / ES / DE / IT / PT / JA / ZH;在“设置”中更改语言后会出现重启提示
- 8 种语言的上下文帮助 —
?徽章面板(描述、使用示例和等效 CLI 命令)现在涵盖每个模块的所有 8 种语言;此前 JA 和 ZH 回退到英语 - 错误修复 — 无论选择何种语言,SMB/NFS 和 Hosts 文件的导航工具提示都以法语显示;已向所有 7 个非法语语言块添加缺失的
nav_hint_smb_nfs和nav_hint_hosts键
v1.3.1 — 2026-06-05
- SSH 密钥管理器 — 列出
~/.ssh/中的所有密钥对(文件、类型、位数、注释、SHA256 指纹);生成 Ed25519 或 RSA 4096 密钥,可选用口令(不匹配检测,按类型自动命名);将公钥复制到剪贴板;通过内联终端中的ssh-copy-id部署到远程服务器,支持 stdin 输入密码提示;删除密钥对需确认;若~/.ssh/不存在则自动创建;国际化:fr / en / es / de
v1.3.0 — 2026-06-03
- TLS / SSL 检查器 — 检查任意服务器的证书:主题 CN、SAN、颁发者、有效日期(颜色编码:绿色 / 橙色 < 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 668externally-managed-environment错误)
v1.2.9 — 2026-05-30
- VNC — 用于管理 VNC 连接配置文件的新模块;与 SSH 和 RDP 类似的分组/子组;启动
vncviewer(TigerVNC);与 macOS ARD 兼容(DH30 认证由 vncviewer 原生处理);密码从不存储;检测缺失vncviewer并给出特定发行版的安装说明 - 关于 — 工具与服务 — 新增部分,列出应用依赖的所有第三方工具和 API
- 侧边栏国际化 — 所有 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(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()现在在接受主题图标之前验证真实像素图是否存在 - NixOS / KDE 兼容性 — 修复 NixOS 上的所有图标:Breeze 6.x 仅提供 SVGZ 图标;Nix 包装器现在将
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,解析文本输出,显示实时表格,包含每跳的丢包率、RTT 最近/平均/最佳/最差/抖动,按丢包严重程度着色;连续模式;CSV + TXT 导出 - 速度测试 — 通过
curl+ Cloudflare(speed.cloudflare.com)实现无依赖速度测试:下载(25 MB)、上传(10 MB)、ping1.1.1.1;最多 5 次运行结果持久化到 JSON;历史折线图(下载/上传) - 防火墙查看器 — 只读规则集查看器:无需 root 即可解析
/etc/nftables.conf和/etc/iptables/*.rules;通过pkexec nft list ruleset查看实时规则集;列:表 / 链 / 规则 / 端口 / 动作 / 注释;动作按颜色编码;实时筛选 - 侧边栏提示 — 每个导航条目现在显示一个微妙的
?徽章;悬停时显示描述模块功能的工具提示;在侧边栏和内容区域之间添加了垂直分隔线 - 国际化 — 所有新模块均已翻译为法语、英语和西班牙语
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) - 带宽监视器 — 明确的启动/停止按钮取代了页面加载时不可靠的自动启动
- 导出 CSV/TXT — Nmap 和 Traceroute 页面现在提供“导出 CSV”和“导出 TXT”按钮(在扫描/追踪完成后出现)
- 国际化 — 为上述所有功能新增翻译键(fr/en/es/de)
v1.1.1 — 2026-05-16
- SSH 终端 — 使用 pyte(VT100/xterm 模拟器)+ QPainter 渲染器完全重写;2000 行回滚、光标闪烁、256 色支持
- 可视化路由追踪 — 世界地图(Natural Earth 110m)、每跳实时地理位置(ip-api.com)、交互式缩放/平移、双解析器(
traceroute/tracepath回退) - 带宽监视器 — 每接口实时吞吐量、60 秒滑动图表、实时速度、会话总量和峰值
- 局域网唤醒 — 纯 Python 幻数据包(UDP 广播)、持久化主机簿(JSON)
- IP 扫描器 — 通过
getent/avahi/nmblookup解析主机名;MAC 地址、厂商(IEEE OUI 39K 条目)、接口列;CSV/TXT 导出已更新 - 国际化 — 所有新页面均已完整翻译为 fr/en/es/de
v1.0.0 — 2026-05-14
首次公开发布 — 13 个模块:仪表盘、接口、Wi-Fi、子网计算器、DNS 查询、Ping 监视器、IP 扫描器、端口扫描器、Nmap、Whois、SNMP、SNTP/NTP、SSH。
系统要求
系统工具
Linux — 大多数工具在标准安装中已经存在:```bash
Arch / EndeavourOS
sudo pacman -S iproute2 networkmanager bind-tools nmap whois net-snmp iputils mtr curl
Debian / Ubuntu
sudo apt install iproute2 network-manager dnsutils nmap whois snmp mtr-tiny curl
Fedora
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数据库会在首次使用时于后台自动下载并缓存在本地。
可选工具
| 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 |
Python
- Python 3.11+
- PySide6 6.6+
- ptyprocess 0.7+
- pyte 0.8+(
pip install pyte或sudo pacman -S python-pyte) - tftpy 0.8+(
pip install tftpy或sudo pacman -S python-tftpy)——文件传输模块
安装
选项 1 — Arch Linux / Manjaro / EndeavourOS(AUR)```bash
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…)并未捆绑 — 请通过你的包管理器安装它们,对应的模块才能正常工作。请参阅下面的要求。
选项 5 — macOS
**最快方式 — 一行命令引导。**适用于完全空白的 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
1. Install Homebrew system tools (see Requirements above)
brew install nmap mtr curl
2. Clone and install
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中创建虚拟环境 - 在虚拟环境内安装 NMLinux 及其 Python 依赖
- 在
~/.local/bin/nmlinux创建启动器 - 添加一个
.desktop条目,使 NMLinux 出现在你的应用程序菜单中
安装后,从终端运行 nmlinux,或从应用程序菜单启动它。
选项 7 — Wheel(所有发行版 / macOS)
从最新发布版下载 .whl 并安装:```bash
Arch / Fedora / macOS — no pip restrictions
pip install nmlinux-1.5.3-py3-none-any.whl
Debian / Ubuntu / Mint — install system libs first, then use pipx
Ubuntu ≤24.04:
sudo apt install libgl1 libglib2.0-0 libdbus-1-3 freerdp2-x11 tigervnc-viewer
Ubuntu 26.04+:
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
选项 9 — 桌面条目(KDE / GNOME / 等)
复制 .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 的任何代码。





