
Kit de herramientas de red unificado para Linux — Python 3 + PySide6
Un kit de herramientas de red unificado para Linux y macOS — inspecciona, conecta, diagnostica.
NMLinux es una interfaz gráfica única y unificada que reúne 29 módulos de red en una sola ventana: monitoreo de interfaces, Wi-Fi, DNS, terminal SSH, visor de firewall, mapa de topología, traceroute y más. Construido desde cero en Python y PySide6 (Qt 6), con 8 idiomas de interfaz y sin dependencias externas más allá de las herramientas estándar del sistema.
[!NOTE] NMLinux no está relacionado con el demonio del sistema Linux
/usr/bin/NetworkManager(NetworkManager de Red Hat/GNOME). NMLinux es un proyecto independiente construido desde cero en Python y PySide6.
Construido con Claude Code (Anthropic) y la contribución de su autor.
NMLinux se construye con asistencia de IA — concretamente Claude Code — y eso no se oculta en ningún lugar de este repositorio. Casi todos los proyectos de software serios usan IA en algún punto de su proceso hoy en día, lo digan o no. Así que «¿se usó IA?» no es la pregunta interesante. La pregunta interesante es: ¿hay algo que lo detecte cuando la IA se equivoca?
Esto es lo que lo hace, si prefieres comprobarlo antes que fiarte de mi palabra:
pytest tests/ -v. Lógica pura más un puñado de pruebas reales de widgets Qt (menús, tablas), sin simular las partes interesantes.docs/Decisions-Techniques.md — cada decisión técnica no obvia, las alternativas rechazadas y los errores (incluidos los introducidos por IA) que se encontraron y corrigieron, con el razonamiento documentado.docs/Architecture.md y docs/Carte-des-Modules.md — la estructura real del código, mantenida sincronizada con lo que se publica.Nada de eso existe porque no se pueda confiar en la IA. Existe porque nada debería publicarse sin un proceso que lo verifique — incluido el código escrito a mano. Juzga el resultado y cómo se verifica, no la herramienta que ayudó a escribirlo.
¿Encontraste un error de todos modos? Eso es útil, no vergonzoso — abre un issue.
GitHub Discussions está abierto — comparte comentarios, reporta ideas, haz preguntas o simplemente saluda. El autor tiene más de 30 años en infraestructura y operaciones, y construyó esta herramienta porque el software bueno, gratuito y sencillo también debería existir para Linux.
Capturas de Linux de la v1.2.7 — capturas de macOS de la v1.3.5. La aplicación ahora tiene 29 módulos y 8 idiomas de interfaz (FR/EN/ES/DE/IT/PT/JA/ZH).
Linux (KDE)
| Panel | Topología |
|---|---|
![]() | ![]() |
| Traceroute | Wi-Fi |
|---|---|
![]() | ![]() |
macOS
| Panel | Traceroute |
|---|---|
![]() | ![]() |
traceroute siempre se resolvía en PATH a través del shim del host incluso cuando el host no tenía un binario traceroute real instalado, por lo que el worker nunca recurría a tracepath y el trazado terminaba al instante sin saltos y sin mostrar ningún error. Ahora recurre a tracepath siempre que traceroute no produzca ninguna salida analizable, independientemente del motivo del fallo.DISPLAY/WAYLAND_DISPLAY están definidas (cualquier sesión gráfica) y ssh no tiene una tty limpia, puede intentar usar $SSH_ASKPASS para la solicitud de contraseña en lugar de la terminal integrada — fallando silenciosamente la autenticación si no hay ningún helper askpass instalado. SSH_ASKPASS_REQUIRE=never ahora obliga a que las solicitudes de contraseña pasen siempre por la propia terminal.packaging/flatpak/ está dirigido a KDE Linux y otras distribuciones solo-Flatpak. Las herramientas CLI del host a las que nmlinux llama externamente (nmcli, pkexec, mount.cifs, ssh, nmap, …) se conectan a través de shims flatpak-spawn --host en PATH en lugar de aislar cada una individualmente; PySide6 proviene de io.qt.PySide.BaseApp de Flathub en lugar del wheel de PyPI. No está publicado en Flathub — se compila un único paquete .flatpak con packaging/flatpak/build-bundle.sh y se adjunta a cada lanzamiento, de la misma manera que ya se hace con AppImage. Descontinuado en la v1.7.12 — ver más arriba.Ctrl+Shift+C o con el menú de clic derecho; pega con Ctrl+Shift+V (existente). Copiar era antes imposible — no existía selección de texto en absolutoiperf3 solo-cliente contra una lista pública de servidores incluida (26 países) o un servidor personalizado guardado (p. ej. un servidor interno de la organización). Soporta TCP/UDP, IPv4/IPv6/automático y dirección inversa (descarga), con jitter/pérdida mostrados para las pruebas UDP. Sugerido por issue #6iperf3 — instálalo para habilitar la pestaña LAN; la pestaña muestra un banner y permanece deshabilitada en caso contrario~/mnt/<host>_<share>), utilizable desde la terminal y desde cualquier otra aplicación — no una vista de exploración transitoria. Solo para la sesión (sin persistencia en fstab/systemd), las credenciales se reutilizan de los campos existentes de usuario/contraseña. Linux usa pkexec mount -t cifs con un archivo de credenciales de permisos restringidos (nunca expuesto a través de ps); macOS usa mount_smbfs directamente. Reintenta automáticamente con un dialecto SMB más antiguo (vers=2.0) cuando un servidor rechaza la negociación predeterminada (común en NAS antiguos) — ambos intentos se realizan bajo una única solicitud de autenticación mediante un proceso helper dedicadocifs-utils (Linux) para el montaje SMB; integrado en macOSbootstrap_macos.sh ya no fuerza NONINTERACTIVE=1 en el instalador de Homebrew, que abortaba inmediatamente en cualquier cuenta de administrador nueva en lugar de solicitar la contraseña de sudo; el one-liner documentado ahora descarga primero el script en lugar de enviarlo directamente a bash, ya que los pasos interactivos anidados (instalador de Xcode CLT, la propia solicitud de sudo de Homebrew) podían interferir con el flujo de entrada del script externo cuando se usaba pipeSmbNfsPage era la única página de destino que faltaba en el sistema de clic derecho entre módulos incluido en la v1.7.0; hacer clic derecho en un host y elegir SMB ahora rellena el campo de host e inicia el escaneo de inmediato, en negrita en el menú cuando se detecta el puerto 445 abiertosystem_profiler (devuelve <redacted> sin los Servicios de Localización) a CoreWLAN como fuente de datos principal; la aplicación ahora solicita permiso de Servicios de Localización en el primer lanzamiento; la página Wi-Fi muestra todas las redes con nombres reales una vez concedidosystem_profiler para el modo de seguridadset_target + consulta automática), DNS (set_target solo relleno), Ping (set_target + inicio automático), Traceroute (set_target + inicio automático), MTR (set_target + inicio automático), Escáner de puertos (set_target + foco), SSH / RDP / VNC (set_target abre el formulario de nueva conexión rellenado), Topología (load_hosts inyecta nodos desde el escaneo del Escáner de IPs/Nmap sin volver a escanear — la puerta de enlace se detecta automáticamente, se dibujan las aristas, el nodo de origen se resalta en rojo), Inventario de activos (prefill_hosts inicia el escaneo de credenciales directamente sobre los hosts descubiertos, omitiendo la fase de descubrimiento ICMP)exec() en Python, NSBundle.mainBundle() se resuelve al bundle Python.framework (CFBundleName = "Python") que Qt lee durante la construcción de QApplication; corregido parcheando el infoDictionary() del bundle y renombrando los elementos de menú nativos a través de AppKit antes de que se cree el menú de la aplicaciónNSProcessInfo.setProcessName_ a través de pyobjc-framework-Cocoa (superado por la v1.6.4)install_macos_app.sh para que macOS asocie correctamente el bundle .app con el proceso en ejecución; se añadieron setprogname y la sobrescritura de sys.argv[0] como respaldos|; cadena de respaldo completa sin derechos de administrador: SO mediante ver, CPU mediante registro, RAM mediante systeminfo, disco mediante wmic → fsutil (coma EN según locale / espacio FR) → dir /-C/System/Volumes/Data), respaldo de CPU para Apple Silicon (hw.model), Synology (/volume1), Unraid (/mnt/user)sshpass, nmap y snmpget instalados a través de Homebrew ahora se encuentran y se llaman usando su ruta absoluta; los bundles .app en macOS no heredan el PATH de Homebrew (/opt/homebrew/bin, /usr/local/bin), por lo que las herramientas previamente instaladas se ignoraban silenciosamentegit pull && bash packaging/install_macos_app.sh desde la raíz del repositorio ahora es el método de actualización documentado; el script gestiona su propio venv (~/.local/share/nmlinux/venv) y no requiere pip ni pipx a nivel de sistemafree -h reemplazado por free compatible con BusyBox; la ruta de código de macOS ahora usa sw_vers para el nombre del SO, respaldo hw.model para CPU de Apple Silicon, /System/Volumes/Data para el volumen de datos de usuario APFS; los volúmenes de Synology/Unraid (/volume1, /mnt/user) se detectan antes que la raíz; el patrón de falso éxito df | tail -1 || … se corrigió con guardas test -d; la salida de lsb_release se limpia de comillas circundantes; se admiten múltiples conjuntos de credenciales SSH/WinRM (prueba cada uno en orden por host)tftpyssl.SSLError; las entradas ahora muestran «… (comprobando)» mientras se ejecuta la comprobación en segundo plano y «— (inalcanzable)» cuando no se puede acceder al host+ Vigilar (usa el host/puerto actual) o manualmente en el panel; la comprobación en segundo plano se ejecuta automáticamente 2 segundos después del lanzamiento; la entrada lateral «Inspector TLS» muestra un punto de color: rojo si algún certificado está caducado, naranja si algún certificado caduca dentro de 30 días; botón de re-comprobación en el panel; la lista muestra estado por entrada (✓ / ⚠ / CADUCADO) con código de colores_arp_entry() ahora llama a arp -n <ip> en macOS y analiza su formato de salida (? (IP) at AA:BB:CC on en0) en lugar de leer /proc/net/arp (solo Linux); las cuatro columnas del escáner ahora se rellenan correctamente en macOSgetent (solo Linux) por socket.gethostbyaddr() de Python para la resolución DNS inversa multiplataforma; la resolución de nombres de host ahora funciona de forma nativa en macOS sin ninguna herramienta adicionalsmbclient (requiere Homebrew samba) a smbutil view (herramienta integrada en macOS); el listado de recursos compartidos SMB ahora funciona en macOS sin necesidad de instalar nadashowmount está integrado en macOS pero no admite --no-headers; el indicador se elimina en macOS y la línea de cabecera se omite en el analizador; el listado de exportaciones NFS ahora funciona de forma nativaxfreerdp, se recurre al esquema de URL open rdp://; abre Microsoft Remote Desktop (App Store) si está instalado, con host, puerto, usuario y dominio predefinidosvncviewer, se recurre al esquema de URL open vnc://; abre Compartir pantalla de macOS (integrado, sin necesidad de instalar nada)-A al comando ssh; permite saltar entre servidores sin copiar tu clave privada (PC → A → B); requiere un agente SSH activo (SSH_AUTH_SOCK); ayuda contextual actualizada en los 8 idiomaspip install reportlab)printer, server, smartphone, cpu, laptop)avahi-browse (opcional, se ejecuta en paralelo con el escaneo de nmap); identifica impresoras (_ipp._tcp, PDL Printer), teléfonos Android y televisores (_googlecast._tcp, _androidtvremote2._tcp), Macs de Apple (am=Mac16,x en el TXT de AirPlay), dispositivos NAS (Synology informa de model=Xserve), escritorios KDE Connect; si avahi no está disponible, recurre a la OUI del fabricante MAC y a heurísticas del nombre de host_IS_MACOS) y usa comandos nativos de macOS: route -n get default, ifconfig, scutil --dns, networksetup, system_profiler SPAirPortDataType, pfctl, netstat -ib; la elevación de privilegios usa osascript + with administrator privileges en lugar de pkexec; la fuente monoespaciada usa Menlo en lugar de Monospace? (descripción, ejemplos de uso y comandos CLI equivalentes) cubre ahora los 8 idiomas para cada módulo; antes JA y ZH recurrían al inglésnav_hint_smb_nfs y nav_hint_hosts a los 7 bloques de idioma no francés~/.ssh/ (archivo, tipo, bits, comentario, huella SHA256); genera claves Ed25519 o RSA 4096 con frase de contraseña opcional (detección de discrepancias, nombre de archivo automático según el tipo); copia la clave pública al portapapeles; despliega en un servidor remoto mediante ssh-copy-id en una terminal integrada con soporte de stdin para los avisos de contraseña; elimina pares de claves con confirmación; crea ~/.ssh/ automáticamente si no existe; i18n: fr / en / es / deopenssl s_client); funciona con certificados válidos, caducados y autofirmados; mensajes de error claros para hosts inalcanzablessmbclient -L con credenciales opcionales, muestra nombre / tipo / comentario del recurso compartido; pestaña NFS: showmount -e, muestra la ruta de exportación y la lista de acceso; detecta herramientas ausentes con instrucciones de instalación específicas por distribución/etc/hosts; tabla con conmutador habilitar/deshabilitar, añadir/editar/eliminar entradas mediante diálogo; filtrar por IP o nombre de host; guarda mediante pkexec cp (diálogo de autenticación de polkit)~/.local/share/nmlinux/venv, instala las dependencias del sistema vía apt, crea un lanzador y una entrada .desktop (corrige el error PEP 668 externally-managed-environment)vncviewer (TigerVNC); compatible con macOS ARD (la autenticación DH30 la gestiona nativamente vncviewer); la contraseña nunca se almacena; detecta la ausencia de vncviewer con instrucciones de instalación específicas por distribuciónxfreerdp como proceso externo; la contraseña se solicita al conectar y nunca se almacena; campos: host, puerto, usuario, dominio, resolución, pantalla completa; detecta la ausencia de xfreerdp con instrucciones de instalación específicas por distribución (Arch / Debian / Fedora)assets/icons/; se renderizan en tiempo de ejecución mediante QSvgRenderer; coloreados #60a5fa; la aplicación ya no requiere ningún tema de iconos del sistema (Breeze, Adwaita, Papirus…)main.py ahora detecta automáticamente el tema de iconos GTK mediante gsettings y lo aplica a Qt; cadenas de respaldo ampliadas para Wi-Fi, Traceroute, Prueba de velocidad, Interfaces, Escáner de puertos, Firewall, MTR; themed_icon() ahora valida que exista un pixmap real antes de aceptar un icono del temaqt6.qtsvg a QT_PLUGIN_PATH para que Qt pueda renderizar iconos SVG; themed_icon() prueba los tamaños 22/24/16/32/48 (Breeze usa 22 px, no 24); el tema se fuerza a breeze cuando se detecta el conjunto de iconos incluido en Nix; también comprueba /etc/xdg/kdeglobals para la configuración de KDE en todo el sistemamtr --report, analiza la salida de texto, muestra una tabla en vivo con % de pérdida, RTT último/promedio/mejor/peor/jitter por salto, codificada por colores según la gravedad de la pérdida; modo continuo; exportación CSV + TXTcurl + Cloudflare (speed.cloudflare.com): descarga (25 MB), subida (10 MB), ping a 1.1.1.1; hasta 5 ejecuciones guardadas en JSON; gráfico de líneas histórico (descarga/subida)/etc/nftables.conf y /etc/iptables/*.rules sin root; conjunto de reglas en vivo mediante pkexec nft list ruleset; columnas: Tabla / Cadena / Regla / Puerto / Acción / Comentario; acciones codificadas por color; filtro en vivo? sutil; al pasar el cursor se muestra un tooltip que describe lo que hace el módulo; se añade un separador vertical entre la barra lateral y el área de contenidocore/theme.py con is_dark(), color_ok(), color_err(); los widgets de pintado personalizados (_Graph, _MapWidget) leen la paleta en el momento de pintar; todos los colores fijos de Catppuccin Mocha se sustituyen por roles semánticos de la paleta de Qt255.255.255.0) derivada del prefijo CIDRtraceroute / tracepath)getent/avahi/nmblookup; dirección MAC, fabricante (OUI IEEE, 39 000 entradas), columnas de interfaz; exportación CSV/TXT actualizadaVersión pública inicial — 13 módulos: Panel general, Interfaces, Wi-Fi, Calculadora de subredes, Consulta DNS, Monitor de ping, Escáner de IP, Escáner de puertos, Nmap, Whois, SNMP, SNTP/NTP, SSH.
Linux — la mayoría ya están presentes en una instalación estándar:```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** — instalar mediante [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 incluye
ping,dig,traceroute,netstat,ifconfig,smbutilyroutede forma nativa.networksetupyscutilson herramientas integradas de macOS, no necesitan instalación. La búsqueda de proveedores OUI en IP Scanner tampoco necesita instalación: la base de datosmanufde Wireshark se descarga automáticamente en segundo plano la primera vez que se usa y se guarda en caché localmente.
pip install pyte or sudo pacman -S python-pyte)pip install tftpy or sudo pacman -S python-tftpy) — módulo de transferencia de archivosyay -S nmlinux
Todas las dependencias (PySide6, ptyprocess, pyte, nmcli, …) se gestionan automáticamente.
### Opción 2 — NixOS / Nix
Ejecuta directamente con el `flake.nix` incluido — no se necesita instalación en todo el sistema:```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
nix run .
O entra en un shell de desarrollo:```bash nix develop python3 -m nmlinux.main
Todas las dependencias de Python (PySide6, ptyprocess, pyte, tftpy) y herramientas del sistema (nmcli, nmap, freerdp, vncviewer, mtr, avahi-browse…) se proporcionan automáticamente mediante el wrapper de Nix.
### Opción 4 — AppImage (cualquier distro Linux, sin instalación)
Descarga `NMLinux-x.y.z-x86_64.AppImage` desde la [última versión](https://github.com/thongor77/nmlinux/releases/latest):```bash
chmod +x NMLinux-*.AppImage
./NMLinux-*.AppImage
No se requiere instalación — Python, Qt y todos los módulos de NMLinux están incluidos en un solo archivo.
Funciona en cualquier Linux x86_64 con glibc 2.17+ (Ubuntu 16.04+, Fedora 26+, Arch, Mint, etc.).
Las herramientas de red del sistema (
nmap,whois,mtr…) no están incluidas — instálalas con tu gestor de paquetes para que los módulos correspondientes funcionen. Consulta Requisitos a continuación.
La forma más rápida — bootstrap en una sola línea. Funciona en una Mac completamente limpia: instala Xcode Command Line Tools, Homebrew, todas las herramientas del sistema y luego NMLinux. Es seguro volver a ejecutarlo (actualiza en lugar de reinstalar):```bash curl -fsSL https://raw.githubusercontent.com/thongor77/nmlinux/main/packaging/bootstrap_macos.sh -o /tmp/bootstrap_macos.sh && bash /tmp/bootstrap_macos.sh
Instalar en todo el sistema (`/Applications`) en lugar de `~/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
No se necesita cuenta de desarrollador de Apple ni notarización de pago: es el mismo script de código abierto
install_macos_app.shen segundo plano, solo que se descarga y se ejecuta por ti. El script es bash simple y legible; siéntete libre de abrir/tmp/bootstrap_macos.shy leerlo antes de ejecutarlo, o revísalo directamente aquí:packaging/bootstrap_macos.sh.La secuencia de descargar y luego ejecutar (en lugar de canalizar directamente hacia
bash) es intencional: en una Mac recién configurada, el script activa pasos interactivos anidados (el instalador de Xcode Command Line Tools, el propio instalador de Homebrew que solicita tu contraseña desudo) que leen desde la terminal; canalizar el script directamente haciabashpuede hacer que esos avisos anidados interfieran con el flujo de entrada del propio script y lo detengan a mitad de camino. Ejecutarlo desde un archivo descargado evita eso por completo.
Instalación manual — si prefieres ejecutar cada paso tú mismo, o ya tienes Homebrew:```bash
brew install nmap mtr curl
git clone https://github.com/thongor77/nmlinux.git cd nmlinux bash packaging/install_macos_app.sh
Para actualizar: `git pull && bash packaging/install_macos_app.sh`
Para desinstalar: `bash packaging/uninstall_macos.sh`
Para instalar en todo el sistema (`/Applications`): `bash packaging/install_macos_app.sh --system`
El script instala automáticamente los siguientes paquetes de Python en el venv:
- `PySide6`, `ptyprocess`, `pyte`, `tftpy`
- `pyobjc-framework-Cocoa` — barra de menús de macOS, diálogos nativos
- `pyobjc-framework-CoreWLAN` — escaneo de SSID de Wi-Fi
- `pyobjc-framework-CoreLocation` — permiso de Servicios de Localización para nombres de Wi-Fi
**Wi-Fi en macOS 26 (Tahoe):** en el primer lanzamiento, macOS solicitará permiso para Servicios de Localización — concédelo para mostrar los nombres de las redes Wi-Fi. El permiso aparece en *Configuración del Sistema › Privacidad y Seguridad › Servicios de Localización*.
> La mayoría de los módulos funcionan en macOS sin modificación. RDP recurre a `open rdp://` (Microsoft Remote Desktop), VNC recurre a `open vnc://` (Screen Sharing integrado). El Administrador de Conexiones tiene funcionalidad reducida en macOS (`nmcli` no está disponible).
### Opción 6 — Debian / Ubuntu / Linux Mint (script de instalación)
> **Nota para usuarios de Linux Mint / Ubuntu:** `pip install` está bloqueado a nivel de sistema en Python 3.12+ (PEP 668 — `externally-managed-environment`). Usa el script de instalación proporcionado — crea un entorno virtual automáticamente e instala una entrada `.desktop`.```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
bash install.sh
El script:
apt (libgl1, python3-venv, freerdp, tigervnc…)~/.local/share/nmlinux/venv~/.local/bin/nmlinux.desktop para que NMLinux aparezca en el menú de aplicacionesDespués de la instalación, ejecuta nmlinux desde una terminal o inícialo desde el menú de aplicaciones.
Descarga el .whl desde la última versión e instálalo:```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
> **Nota para Ubuntu 26.04+:** `pipx` requiere que las bibliotecas del sistema (libGL, etc.) estén instaladas primero — los comandos anteriores las cubren. Si `pipx install` falla debido a un error de compilación de PySide6, usa la **Opción 4** (script de instalación) en su lugar, que maneja todo automáticamente.
### Opción 8 — Desde el código fuente (Arch / Fedora / macOS)```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
pip install PySide6 ptyprocess pyte tftpy
python3 -m nmlinux.main
Copia el archivo .desktop para que NMLinux aparezca en tu lanzador de aplicaciones:```bash
cp data/nmlinux.desktop ~/.local/share/applications/
update-desktop-database ~/.local/share/applications/
Luego edita la ruta de `Exec=` en el archivo si es necesario.
---
## Ejecución```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
---
## Compatibilidad con entornos de escritorio
Desde la v1.2.7, NMLinux utiliza 21 iconos SVG de [Lucide](https://lucide.dev) incluidos, renderizados en tiempo de ejecución mediante `QSvgRenderer`. La aplicación ya no depende de ningún tema de iconos del sistema (Breeze, Adwaita, Papirus…) y se muestra correctamente en KDE, GNOME, XFCE y otros. El estilo Qt se adapta automáticamente al escritorio en ejecución.
---
## Limitaciones
### Linux
Soporte completo — los 29 módulos disponibles.
### macOS
La mayoría de los módulos funcionan directamente, ya que utilizan herramientas disponibles en ambas plataformas (`ssh`, `dig`, `ping`, `curl`, `nmap`, `openssl`…).
**9 módulos requirieron una adaptación explícita para macOS** (rutas de código duales que detectan la plataforma al inicio): Dashboard, Interfaces, Wi-Fi, Topology, Bandwidth, Firewall, Connection Manager, Hosts File, MTR — estos usan comandos nativos de macOS (`ifconfig`, `networksetup`, `scutil`, `pfctl`, `system_profiler`…) en lugar de sus equivalentes de Linux.
**Módulos con soporte limitado o sin soporte en macOS:**
| Módulo | Estado | Notas |
|--------|--------|-------|
| **RDP** | ✓ macOS | Recurre a `open rdp://` → Microsoft Remote Desktop (App Store) |
| **VNC** | ✓ macOS | Recurre a `open vnc://` → Screen Sharing (integrado, sin instalación) |
| **IP Scanner** | ✓ macOS | Usa `socket.gethostbyaddr()` — Python nativo, sin herramientas adicionales |
| **SMB** | ✓ macOS | Usa `smbutil view` (integrado) en lugar de `smbclient` |
| **NFS** | ✓ macOS | `showmount` integrado; análisis de cabeceras adaptado |
| **Connection Manager** | ⚠ Reducido | Editar/eliminar requieren `nmcli` (solo Linux); la vista de lista funciona |
### General
- Sin integración con root/polkit — las herramientas que requieren privilegios elevados (algunos modos de Nmap, sockets raw) deben ejecutarse con `sudo`; en macOS, la elevación de privilegios utiliza `osascript` + privilegios de administrador
- El reenvío del agente SSH requiere un agente SSH activo (`SSH_AUTH_SOCK`); en macOS, esto lo gestiona automáticamente el sistema, sin necesidad de configuración manual
---
## Créditos y agradecimientos
- **[Anthropic](https://www.anthropic.com)** — Claude Code, el asistente de IA utilizado para construir este proyecto
- El autor, por la visión, las pruebas y la dirección
---
## Apoya el proyecto
Si NMLinux te resulta útil, considera apoyar su desarrollo:
- **PayPal** — [Dona a través de 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`
---
## Licencia
GPL-2.0 — consulta [LICENSE](https://github.com/thongor77/nmlinux/blob/HEAD/LICENSE).
Este proyecto es una reimplementación independiente. No se utilizó ni se tradujo ningún código de NETworkManager.
flatpak-spawn --hostTIOCSCTTYEPERMscript| Herramienta | Característica | Linux | macOS |
|---|
xfreerdp / xfreerdp3 | Escritorio remoto (RDP) | Arch: freerdp · Ubuntu ≤24.04: freerdp2-x11 · Ubuntu 26.04+: freerdp3-x11 | opcional — recurre a Microsoft Remote Desktop (open rdp://) |
vncviewer | VNC | Arch: tigervnc · Debian: tigervnc-viewer | opcional — recurre a Screen Sharing de macOS (open vnc://, integrado) |
nm-connection-editor | Editar conexiones desde el Administrador de conexiones | Arch: nm-connection-editor | — (en su lugar se abre System Preferences) |
traceroute | Alternativa a traceroute (se usa tracepath de forma predeterminada) | Arch: traceroute | integrado |
mount.cifs (cifs-utils) | Montar recursos compartidos SMB desde el menú contextual | Arch/Debian: cifs-utils | integrado (mount_smbfs) |
iperf3 | Prueba de velocidad — pestaña LAN | Arch: iperf3 · Debian/Ubuntu: iperf3 | brew install iperf3 |