
Унифицированный сетевой инструментарий для Linux — Python 3 + PySide6
# 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 — это единый унифицированный графический интерфейс, объединяющий 29 сетевых модулей в одном окне: мониторинг интерфейсов, Wi-Fi, DNS, терминал SSH, просмотр брандмауэра, карта топологии, traceroute и многое другое. Написан с нуля на Python и PySide6 (Qt 6), поддерживает 8 языков интерфейса и не требует внешних зависимостей помимо стандартных системных утилит. > [!NOTE] > **NMLinux не связан с системным демоном Linux `/usr/bin/NetworkManager` (NetworkManager от Red Hat/GNOME).** NMLinux — это самостоятельный проект, написанный с нуля на Python и PySide6. > Создан с помощью [Claude Code](https://claude.ai/code) (Anthropic) и при участии его автора. --- ## Процесс разработки NMLinux создаётся с использованием ИИ — в частности, [Claude Code](https://claude.ai/code) — и это нигде в данном репозитории не скрывается. Практически каждый серьёзный программный проект сегодня где-то использует ИИ в своём конвейере, признаётся он в этом или нет. Поэтому вопрос «участвовал ли ИИ» — не самый интересный. Интересный вопрос: есть ли что-то, что ловит ошибки, когда ИИ ошибается? Вот что для этого есть, если вы предпочитаете проверить, а не верить мне на слово: - **162 теста** — `pytest tests/ -v`. Чистая логика плюс несколько реальных тестов виджетов Qt (меню, таблицы), без подмены моками интересных частей. - **[`docs/Decisions-Techniques.md`](https://github.com/thongor77/nmlinux/blob/main/docs/Decisions-Techniques.md)** — каждое неочевидное техническое решение, отвергнутые альтернативы и баги (включая внесённые ИИ), которые были найдены и исправлены, с записанным обоснованием. - **[`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 поддерживаемых языках. Ничего из этого не существует потому, что ИИ нельзя доверять. Это существует потому, что ничто не должно выпускаться без процесса, который его проверяет — включая написанный вручную код. Судите по результату и по тому, как он проверяется, а не по инструменту, который помог его написать. Всё же нашли баг? Это полезно, а не стыдно — [откройте 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)** | Панель управления | Топология | |-----------|----------| |  |  | | Traceroute | Wi-Fi | |------------|-------| |  |  | **macOS** | Панель управления | Traceroute | |-----------|------------| |  |  | --- ## Список изменений ### v1.7.14 — 2026-09-30 - **AppImage — исправление падения при запуске, попытка 2**: исправление из v1.7.13 (удаление встроенных системных библиотек) оказалось недостаточным — сам встроенный интерпретатор Python (`libpython3.14.so.1.0`, собранный против glibc 2.44 сборочной машины Arch Linux) всё ещё требовал символы glibc новее, чем есть на тестовой машине каталога AppImageHub (Ubuntu 22.04, glibc 2.35), поэтому AppImage продолжал падать прямо при запуске. Теперь `build-appimage.sh` собирает пакет PyInstaller внутри контейнера `ubuntu:22.04` (через `podman`), а не на хосте, так что каждый встроенный бинарник слинкован именно с той версией glibc, которую AppImage должен поддерживать. ### v1.7.13 — 2026-09-30 - **AppImage — исправление падения при запуске (неполное, см. v1.7.14)**: `build-appimage.sh` включал в пакет разделяемые библиотеки (`libz.so.1`, `libstdc++.so.6`, `libX11.so.6`, `libfontconfig.so.1` и другие) прямо из очень свежей glibc сборочной машины Arch Linux. На более старых дистрибутивах AppImage падал сразу при запуске (`GLIBC_ABI_DT_RELR' not found`), что было выявлено автоматическим тестом каталога AppImageHub. Теперь эти библиотеки удалены из пакета, чтобы AppImage использовал собственные копии хост-системы — это стандартный подход для AppImage. ### v1.7.12 — 2026-08-12 - **Traceroute — исправление**: под Flatpak (v1.7.11, см. ниже — теперь удалён) `traceroute` всегда разрешался в `PATH` через хост-шим, даже когда на хосте не был установлен настоящий бинарник `traceroute`, поэтому воркер никогда не переключался на `tracepath`, и трассировка завершалась мгновенно без хопов и без отображения ошибки. Теперь он переключается на `tracepath` всякий раз, когда `traceroute` вообще не выдаёт разбираемый вывод, независимо от *причины* сбоя. - **Терминал SSH — исправление askpass**: когда заданы `DISPLAY`/`WAYLAND_DISPLAY` (любая графическая сессия) и у ssh нет чистого tty, он может попытаться использовать `$SSH_ASKPASS` для запроса пароля вместо встроенного терминала — что приводит к молчаливому сбою аутентификации, если помощник askpass не установлен. Теперь `SSH_ASKPASS_REQUIRE=never` заставляет запросы пароля всегда идти через сам терминал. - **Упаковка Flatpak удалена**: локальный манифест KDE Linux, поставлявшийся в v1.7.11, прекращён. Исследование вышеописанного бага с запросом пароля SSH выявило ограничение на уровне ядра: процесс, перенаправленный через `flatpak-spawn --host`, никогда не может стать владельцем управляющего терминала для перенаправленного pty (`TIOCSCTTY` отклоняется с `EPERM` — другая, несвязанная сессия уже владеет им; это намеренная граница безопасности ядра, а не баг). Единственный рабочий обходной путь (`script`, выделяющий новый pty) исправляет запрос пароля, но ломает распространение изменения размера терминала в реальном времени для этой сессии — признано худшим компромиссом, чем полный отказ от поставки Flatpak. AUR и AppImage — поддерживаемые пути установки в Linux в дальнейшем. ### v1.7.11 — 2026-08-03 - **Упаковка Flatpak (KDE Linux)**: локальный манифест сборки в `packaging/flatpak/` нацелен на KDE Linux и другие дистрибутивы только с Flatpak. Хост-утилиты CLI, к которым nmlinux обращается через оболочку (`nmcli`, `pkexec`, `mount.cifs`, `ssh`, `nmap`, …), подключаются через шимы `flatpak-spawn --host` в `PATH` вместо индивидуальной изоляции каждой из них; PySide6 берётся из `io.qt.PySide.BaseApp` от Flathub, а не из колеса PyPI. Не опубликован на Flathub — вместо этого единый пакет `.flatpak` собирается с помощью `packaging/flatpak/build-bundle.sh` и прикрепляется к каждому релизу, так же как уже делается с 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)**: наряду с существующим тестом скорости интернета новая вкладка запускает клиентские тесты `iperf3` против либо встроенного списка публичных серверов (26 стран), либо сохранённого пользовательского сервера (например, внутреннего сервера организации). Поддерживает TCP/UDP, IPv4/IPv6/авто и обратное (загрузка) направление, с отображением джиттера/потерь для UDP-тестов. Предложено в [issue #6](https://github.com/thongor77/nmlinux/issues/6) - **Новая опциональная зависимость**: `iperf3` — установите, чтобы включить вкладку LAN; иначе вкладка показывает баннер и остаётся отключённой ### v1.7.6 — 2026-07-05 - **Инвентаризация активов — обновление по правому клику**: щёлкните правой кнопкой по одной или нескольким уже просканированным строкам (поддерживается множественный выбор) и выберите «Обновить выбранные», чтобы пересканировать только эти хосты на месте, вместо повторного запуска полного сканирования сети - **Инвентаризация активов — обратная связь о сбое аутентификации SSH**: отклонённый вход по SSH теперь показывает «SSH auth failed» вместо молчаливого сбоя, не теряя базовые данные имени хоста/ОС, обнаруженные Nmap — подтверждено на реальном Synology NAS, где Auto Block в DSM отклонил правильный пароль после того, как сначала были опробованы другие настроенные наборы учётных данных ### v1.7.5 — 2026-07-04 - **Ping Monitor — каталог сохранённых целей**: новая панель слева позволяет сохранять цели ping (имя, хост, интервал) в постоянный список, чтобы отслеживаемые хосты переживали перезапуск приложения, а не приходилось вводить их заново. Кнопка ★ на каждой активно отслеживаемой строке сохраняет этот хост в каталог в любой момент сессии — не нужно было планировать заранее до неожиданного закрытия приложения - **Ping Monitor — «Начать мониторинг»**: выберите сохранённую цель и начните мониторинг одним кликом, используя её сохранённый интервал ### v1.7.4 — 2026-07-04 - **Инвентаризация активов — исправлены несогласованные результаты сканирования**: проверка доступности отправляла один ping с таймаутом 1 секунда без повторов, что могло пропустить реальное устройство под собственной конкурентной нагрузкой сканера (до 40 хостов одновременно) или когда Wi-Fi-хост ненадолго засыпал между маяками — подтверждено вживую на реальной подсети, возвращавшей разное количество устройств при повторных запусках одного и того же диапазона. Теперь проверка повторяет ping перед переходом к TCP-пробе порта - **Инвентаризация активов — новая кнопка «Обновить пустые»**: после сканирования пересканировать только IP-адреса, не вернувшие данных, вместо всего диапазона заново; вновь найденные хосты объединяются с существующими результатами ### v1.7.3 — 2026-07-03 - **SMB — монтирование общих ресурсов из контекстного меню**: щёлкните правой кнопкой по общему ресурсу на вкладке SMB и выберите «Смонтировать/Размонтировать», чтобы смонтировать его по стабильному локальному пути (`~/mnt/<host>_<share>`), доступному из терминала и любого другого приложения — это не временный просмотр. Только на время сессии (без сохранения в fstab/systemd), учётные данные берутся из существующих полей пользователя/пароля. Linux использует `pkexec mount -t cifs` с файлом учётных данных с ограниченными правами (никогда не раскрывается через `ps`); macOS использует `mount_smbfs` напрямую. Автоматически повторяет попытку с более старым диалектом SMB (`vers=2.0`), когда сервер отклоняет согласование по умолчанию (часто со старыми NAS) — обе попытки выполняются под одним запросом аутентификации через выделенный вспомогательный процесс - **Новая опциональная зависимость**: `cifs-utils` (Linux) для монтирования SMB; встроено в macOS ### v1.7.2 — 2026-07-03 - **Установка на macOS — исправлены два бага начальной загрузки, найденные на чистом Mac**: `bootstrap_macos.sh` больше не навязывает `NONINTERACTIVE=1` установщику Homebrew, что немедленно прерывалось на любой свежей учётной записи администратора вместо запроса пароля sudo; документированная однострочная команда теперь сначала скачивает скрипт, а не передаёт его напрямую в `bash`, поскольку вложенные интерактивные шаги (установщик Xcode CLT, собственный запрос sudo от Homebrew) могли вмешиваться во входной поток внешнего скрипта при передаче через конвейер - **Универсальное контекстное меню — добавлен SMB**: `SmbNfsPage` была единственной целевой страницей, отсутствовавшей в межмодульной системе правого клика, поставленной в v1.7.0; щелчок правой кнопкой по хосту и выбор SMB теперь заполняет поле хоста и немедленно запускает сканирование, выделяясь жирным в меню, когда обнаружен открытый порт 445 - **i18n — переведены оставшиеся строки панели управления**: метка задержки шлюза, заголовок карточки TLS Watchlist и её строка состояния всё ещё были жёстко закодированы на французском; теперь переведены на все 8 языков интерфейса ### v1.7.1 — 2026-07-02 - **macOS 26 (Tahoe)** — исправления SSID Wi-Fi: переключение с `system_profiler` (возвращает `<redacted>` без служб геолокации) на **CoreWLAN** в качестве основного источника данных; приложение теперь запрашивает разрешение на службы геолокации при первом запуске; страница Wi-Fi показывает все сети с реальными именами после предоставления разрешения - **macOS** — Менеджер подключений: подключённый SSID теперь читается через CoreWLAN, а `system_profiler` — для режима безопасности - **macOS** — SMB: понятное сообщение «требуется аутентификация», когда NAS требует учётные данные; исправлено ложное предупреждение smb.conf от Homebrew smbclient - **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 без повторного сканирования — шлюз определяется автоматически, рисуются рёбра, исходный узел выделяется красным), Инвентаризация активов (`prefill_hosts` запускает сканирование учётных данных непосредственно на обнаруженных хостах, пропуская фазу обнаружения ICMP) - **Панель управления — график ping шлюза**: живой спарклайн задержки, обновляемый каждые 2 секунды; цветовая кодировка (<20 мс зелёный / 20–100 мс оранжевый / >100 мс красный / таймаут красный) - **Панель управления — сводка TLS Watchlist**: карточка состояния на панели управления автоматически отражает состояние TLS Watchlist (OK / истекает / тревога) без повторного запроса - **Панель управления — изменение размера геокарты**: карта мира теперь расширяется по горизонтали при изменении размера окна ### v1.6.4 — 2026-06-28 - **macOS**: строка меню теперь показывает **NMLinux** вместо **Python** — первопричина: после `exec()` в Python `NSBundle.mainBundle()` разрешается в пакет `Python.framework` (CFBundleName = "Python"), который Qt читает во время создания QApplication; исправлено путём патча `infoDictionary()` пакета и переименования нативных пунктов меню через AppKit до создания меню приложения ### v1.6.3 — 2026-06-28 - **macOS**: первая попытка исправить строку меню с помощью `NSProcessInfo.setProcessName_` через `pyobjc-framework-Cocoa` (заменена в v1.6.4) ### v1.6.2 — 2026-06-28 - **macOS**: скрипт-лаунчер bash заменён скомпилированным C-стабом в `install_macos_app.sh`, чтобы macOS правильно связывала пакет `.app` с запущенным процессом; добавлены `setprogname` и переопределение `sys.argv[0]` в качестве запасных вариантов ### v1.6.1 — 2026-06-25 - **Терминал SSH — исправлено удалённое эхо**: нажатия клавиш, введённые во встроенном терминале SSH, отправлялись в удалённую оболочку, но никогда не возвращались эхом (клавиатура казалась «мёртвой» после входа). nmlinux принудительно отключал локальное эхо PTY, и ssh распространял это «отсутствие эха» на удалённый pty через свои режимы терминала (pty-req), поэтому удалённая оболочка переставала повторять ввод. Воспроизведено на свежей виртуальной машине Ubuntu 26.04 (недавний OpenSSH точно применяет эти режимы). Теперь терминал оставляет PTY в обычном режиме и позволяет ssh управлять эхом, как в настоящих эмуляторах терминала. ### v1.6.0 — 2026-06-24 - **Инвентаризация активов — WinRM Windows (завершено)**: обнаружение хоста через TCP-пробу порта, когда ICMP блокируется брандмауэром Windows; PowerShell теперь использует полный абсолютный путь + **EncodedCommand (base64)**, чтобы cmd.exe не интерпретировал конвейеры `|`; полная цепочка запасных вариантов без прав администратора: ОС через `ver`, CPU через реестр, RAM через `systeminfo`, диск через `wmic` → `fsutil` (с учётом локали: запятая EN / пробел FR) → `dir /-C` - **Инвентаризация активов — SSH с несколькими учётными данными**: поддерживается несколько наборов учётных данных SSH; исправлен диск macOS (`/System/Volumes/Data`), запасной вариант CPU Apple Silicon (`hw.model`), Synology (`/volume1`), Unraid (`/mnt/user`) - **Исправления багов**: ошибки WinRM теперь отображаются в таблице вместо молчаливого запасного варианта; обнаружение хостов WinRM/SNMP больше не блокируется наличием учётных данных SSH; исправлен таймаут pywinrm ### v1.5.3 — 2026-06-24 - **macOS .app — обнаружение инструментов Homebrew**: `sshpass`, `nmap` и `snmpget`, установленные через Homebrew, теперь находятся и вызываются по абсолютному пути; пакеты `.app` в macOS не наследуют PATH Homebrew (`/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 --- [Read more](https://github.com/thongor77/nmlinux)