
Linux용 통합 네트워크 툴킷 — Python 3 + PySide6
Linux 및 macOS용 통합 네트워크 툴킷 — 검사, 연결, 진단.
NMLinux는 29개의 네트워크 모듈을 하나의 창에 통합한 단일 GUI입니다: 인터페이스 모니터링, 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 — 명확하지 않은 모든 기술적 결정, 거부된 대안, 그리고 발견되어 수정된 버그(AI가 유발한 것 포함)와 그 근거가 기록되어 있습니다.docs/Architecture.md 및 docs/Carte-des-Modules.md — 출시되는 것과 동기화된 실제 코드 구조.이러한 것들이 존재하는 이유는 AI를 신뢰할 수 없기 때문이 아닙니다. 검증 프로세스 없이는 어떤 것도 출시되어서는 안 되기 때문입니다 — 직접 작성한 코드도 포함해서 말입니다. 출력물과 검증 방식을 판단하세요. 작성에 도움을 준 도구가 아니라.
그래도 버그를 찾았나요? 그건 부끄러운 일이 아니라 유용한 일입니다 — 이슈를 열어주세요.
GitHub Discussions이 열려 있습니다 — 피드백을 공유하고, 아이디어를 보고하고, 질문하거나, 인사만 건네도 됩니다. 저자는 인프라 및 운영 분야에서 30년 이상의 경력을 가지고 있으며, 좋고 무료이며 간단한 소프트웨어가 Linux에도 존재해야 한다는 생각으로 이 도구를 만들었습니다.
Linux 스크린샷은 v1.2.7 기준 — macOS 스크린샷은 v1.3.5 기준. 현재 앱은 29개 모듈과 8개 인터페이스 언어(FR/EN/ES/DE/IT/PT/JA/ZH)를 지원합니다.
Linux (KDE)
| Dashboard | 토폴로지 |
|---|---|
![]() | ![]() |
| Traceroute | Wi-Fi |
|---|---|
![]() | ![]() |
macOS
| Dashboard | 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가 으로 거부됨 — 다른 무관한 세션이 이미 소유하고 있음; 이는 의도적인 커널 보안 경계이며 버그가 아닙니다). 유일한 해결 방법(, 새 pty 할당)은 비밀번호 프롬프트를 수정하지만 해당 세션의 실시간 터미널 크기 전파를 깨뜨립니다 — Flatpak을 아예 제공하지 않는 것보다 더 나쁜 절충으로 판단되었습니다. AUR과 AppImage가 향후 지원되는 Linux 설치 경로입니다.packaging/flatpak/ 아래의 로컬 빌드 매니페스트가 KDE Linux 및 기타 Flatpak 전용 배포판을 대상으로 합니다. nmlinux가 외부로 호출하는 호스트 CLI 도구(nmcli, pkexec, mount.cifs, ssh, nmap, …)는 각각을 샌드박싱하는 대신 PATH의 flatpak-spawn --host shim을 통해 브리지됩니다; PySide6는 PyPI 휠이 아닌 Flathub의 io.qt.PySide.BaseApp에서 가져옵니다. Flathub에는 게시되지 않습니다 — AppImage가 이미 그런 것처럼 packaging/flatpak/build-bundle.sh로 단일 .flatpak 번들이 빌드되어 각 릴리스에 첨부됩니다. v1.7.12에서 중단됨 — 위 참조.Ctrl+Shift+C 또는 오른쪽 클릭 메뉴로 복사; Ctrl+Shift+V(기존)로 붙여넣기. 이전에는 텍스트 선택 자체가 없어 복사가 불가능했습니다iperf3 테스트를 실행합니다. TCP/UDP, IPv4/IPv6/자동, 역방향(다운로드) 방향을 지원하며 UDP 테스트에는 지터/손실이 표시됩니다. 이슈 #6에서 제안됨iperf3 — LAN 탭을 활성화하려면 설치하세요; 탭은 배너를 표시하고 그렇지 않으면 비활성 상태로 유지됩니다~/mnt/<host>_<share>)에 마운트합니다 — 터미널 및 다른 앱에서 사용 가능한 일시적이지 않은 탐색 보기가 아닙니다. 세션 전용(fstab/systemd 영속성 없음), 자격 증명은 기존 사용자/비밀번호 필드에서 재사용됩니다. Linux는 제한된 권한의 자격 증명 파일(ps로 노출되지 않음)과 함께 pkexec mount -t cifs를 사용합니다; macOS는 mount_smbfs를 직접 사용합니다. 서버가 기본 협상을 거부할 때(오래된 NAS 장치에서 흔함) 이전 SMB 버전(vers=2.0)으로 자동 재시도합니다 — 두 시도 모두 전용 헬퍼 프로세스를 통해 단일 인증 프롬프트에서 발생합니다cifs-utils(Linux); 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 스캔에서 노드 주입 — 게이트웨이 자동 감지, 가장자리 그려짐, 원본 노드 빨간색으로 강조), Asset Inventory(prefill_hosts는 발견된 호스트에서 직접 자격 증명 스캔 시작, ICMP 발견 단계 건너뜀)exec()로 Python에 진입한 후 NSBundle.mainBundle()은 Qt가 QApplication 구성 중에 읽는 Python.framework 번들(CFBundleName = "Python")로 확인됩니다; 애플리케이션 메뉴가 생성되기 전에 번들의 infoDictionary()를 패치하고 AppKit을 통해 네이티브 메뉴 항목 이름을 변경하여 수정됨pyobjc-framework-Cocoa를 통한 NSProcessInfo.setProcessName_을 사용한 메뉴 바 수정 첫 시도(v1.6.4로 대체됨)install_macos_app.sh의 컴파일된 C 스텁으로 교체하여 macOS가 .app 번들을 실행 중인 프로세스와 올바르게 연결하도록 함; 폴백으로 setprogname 및 sys.argv[0] 재정의 추가|를 해석하지 못하도록 함; 관리자 권한 없는 전체 폴백 체인: OS는 ver, CPU는 레지스트리, RAM은 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 번들은 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 코드 경로는 이제 OS 이름에 sw_vers, Apple Silicon CPU에 hw.model 폴백, APFS 사용자 데이터 볼륨에 /System/Volumes/Data 사용; Synology/Unraid 볼륨(/volume1, /mnt/user)이 루트보다 먼저 감지됨; df | tail -1 || … 거짓 성공 패턴을 test -d 가드로 수정; lsb_release 출력에서 주변 따옴표 제거; 여러 SSH/WinRM 자격 증명 세트 지원(호스트별 각각 순서대로 시도)tftpyssl.SSLError 하위 클래스를 포함하도록 확장됨; 항목은 이제 백그라운드 검사 중 "… (확인 중)"을 표시하고 호스트에 연결할 수 없을 때 "— (연결 불가)"를 표시합니다+ Watch(현재 호스트/포트 사용) 또는 패널에서 수동으로 호스트 추가; 백그라운드 검사는 실행 2초 후 자동으로 실행됩니다; 사이드바 "TLS Inspector" 항목은 색상 점을 표시합니다: 인증서가 만료되면 빨간색, 30일 내 만료 예정이면 주황색; 패널의 재검사 버튼; 목록은 항목별 상태(✓ / ⚠ / EXPIRED)를 색상 코드와 함께 표시합니다_arp_entry()는 이제 macOS에서 arp -n <ip>를 호출하고 /proc/net/arp(Linux 전용)를 읽는 대신 출력 형식(? (IP) at AA:BB:CC on en0)을 파싱합니다; 네 개의 스캐너 열이 모두 macOS에서 올바르게 채워집니다getent를 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 에이전트(SSH_AUTH_SOCK) 필요; 상황별 도움말이 8개 언어 모두 업데이트됨pip install reportlab)printer, server, smartphone, cpu, laptop)avahi-browse를 통해 감지됨(선택 사항, nmap 스캔과 병렬 실행); 프린터(_ipp._tcp, PDL Printer), Android 휴대폰 및 TV(_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; 권한 상승은 pkexec 대신 osascript + with administrator privileges 사용; 고정폭 글꼴은 Monospace 대신 Menlo 사용? 배지 패널(설명, 사용 예시, 동등한 CLI 명령)이 이제 모든 모듈에 대해 8개 언어 모두 지원; 이전에는 JA와 ZH가 영어로 대체됨nav_hint_smb_nfs 및 nav_hint_hosts 키를 프랑스어 외 7개 언어 블록에 추가~/.ssh/의 모든 키 쌍 나열(파일, 유형, 비트, 주석, SHA256 지문); 선택적 암호가 있는 Ed25519 또는 RSA 4096 키 생성(불일치 감지, 유형별 자동 파일 이름); 공개 키를 클립보드에 복사; 인라인 터미널에서 ssh-copy-id를 통해 원격 서버에 배포(암호 프롬프트용 stdin 지원); 확인 후 키 쌍 삭제; 누락 시 ~/.ssh/ 자동 생성; i18n: 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 실행; 연결 시 암호 프롬프트, 절대 저장되지 않음; 필드: 호스트, 포트, 사용자 이름, 도메인, 해상도, 전체 화면; 배포판별 설치 지침(Arch / Debian / Fedora)과 함께 누락된 xfreerdp 감지assets/icons/에 번들됨; QSvgRenderer를 통해 런타임에 렌더링; #60a5fa 색상; 앱은 더 이상 시스템 아이콘 테마(Breeze, Adwaita, Papirus 등)가 필요 없음main.py는 이제 gsettings를 통해 GTK 아이콘 테마를 자동 감지하여 Qt에 적용; Wi-Fi, Traceroute, 속도 테스트, 인터페이스, 포트 스캐너, 방화벽, MTR에 대한 확장 대체 체인; themed_icon()은 이제 테마 아이콘을 수락하기 전에 실제 픽스맵이 존재하는지 검증qt6.qtsvg를 QT_PLUGIN_PATH에 추가하여 Qt가 SVG 아이콘을 렌더링할 수 있게 함; themed_icon()은 크기 22/24/16/32/48을 시도(Breeze는 24px가 아닌 22px 사용); Nix 번들 아이콘 세트가 감지되면 테마를 breeze로 강제; 시스템 전체 KDE 구성을 위해 /etc/xdg/kdeglobals도 확인mtr --report 실행, 텍스트 출력 파싱, 홉별 손실 %, RTT 최근/평균/최고/최저/지터가 포함된 실시간 테이블 표시, 손실 심각도별 색상 코드; 연속 모드; CSV + TXT 내보내기curl + Cloudflare(speed.cloudflare.com)를 통한 종속성 없는 속도 테스트: 다운로드(25MB), 업로드(10MB), 1.1.1.1에 핑; 최대 5회 실행이 JSON에 저장; 이력 선 그래프(다운로드/업로드)/etc/nftables.conf 및 /etc/iptables/*.rules 파싱; pkexec nft list ruleset을 통한 실시간 규칙 집합; 열: 테이블 / 체인 / 규칙 / 포트 / 동작 / 설명; 색상 코드 동작; 실시간 필터? 배지 표시; 호버 시 모듈이 수행하는 작업을 설명하는 툴팁 표시; 사이드바와 콘텐츠 영역 사이에 세로 구분선 추가is_dark(), color_ok(), color_err()가 있는 새 core/theme.py; 사용자 정의 페인터 위젯(_Graph, _MapWidget)은 페인트 시 팔레트를 읽음; 모든 하드코딩된 Catppuccin Mocha 색상을 의미론적 Qt 팔레트 역할로 대체255.255.255.0) 표시traceroute / tracepath 대체)getent/avahi/nmblookup을 통한 호스트 이름 확인; MAC 주소, 벤더(IEEE OUI 39K 항목), 인터페이스 열; CSV/TXT 내보내기 업데이트최초 공개 릴리스 — 13개 모듈: 대시보드, 인터페이스, Wi-Fi, 서브넷 계산기, DNS 조회, 핑 모니터, 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 벤더 조회도 설치가 필요 없습니다. Wiresharkmanuf데이터베이스는 첫 사용 시 백그라운드에서 자동으로 다운로드되어 로컬에 캐시됩니다.
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 래퍼를 통해 자동으로 제공됩니다.
### 옵션 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+ (Ubuntu 16.04+, Fedora 26+, Arch, Mint 등)이 있는 모든 x86_64 Linux에서 작동합니다.
시스템 네트워크 도구(
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 개발자 계정이나 유료 공증(notarization)이 필요 없습니다 — 내부적으로는 동일한 오픈소스
install_macos_app.sh를 사용하며, 단지 자동으로 가져와서 실행해 줄 뿐입니다. 이 스크립트는 단순하고 읽기 쉬운 bash입니다. 실행 전에/tmp/bootstrap_macos.sh를 열어 읽어보거나, 여기에서 직접 확인할 수 있습니다:packaging/bootstrap_macos.sh.다운로드 후 실행(파이프로 바로
bash에 연결하지 않는 방식)은 의도적입니다: 새 Mac에서는 스크립트가 중첩된 대화형 단계(Xcode Command Line Tools 설치 프로그램, 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
To update: `git pull && bash packaging/install_macos_app.sh`
To uninstall: `bash packaging/uninstall_macos.sh`
To install system-wide (`/Applications`): `bash packaging/install_macos_app.sh --system`
The script installs the following Python packages into the venv automatically:
- `PySide6`, `ptyprocess`, `pyte`, `tftpy`
- `pyobjc-framework-Cocoa` — macOS menu bar, native dialogs
- `pyobjc-framework-CoreWLAN` — Wi-Fi SSID scanning
- `pyobjc-framework-CoreLocation` — Location Services permission for Wi-Fi names
**macOS 26(Tahoe)의 Wi-Fi:** 첫 실행 시 macOS가 위치 서비스(Location Services) 권한을 요청합니다. Wi-Fi 네트워크 이름을 표시하려면 이를 허용하세요. 해당 권한은 *시스템 설정 › 개인정보 보호 및 보안 › 위치 서비스*에서 확인할 수 있습니다.
> 대부분의 모듈은 macOS에서 수정 없이 작동합니다. RDP는 `open rdp://`(Microsoft Remote Desktop)로 대체되고, VNC는 `open vnc://`(내장 화면 공유)로 대체됩니다. 연결 관리자(Connection Manager)는 macOS에서 기능이 축소됩니다(`nmcli` 사용 불가).
### 옵션 6 — Debian / Ubuntu / Linux Mint(설치 스크립트)
> **Linux Mint / Ubuntu 사용자 참고 사항:** Python 3.12 이상에서는 `pip install`이 시스템 전체에서 차단됩니다(PEP 668 — `externally-managed-environment`). 제공된 설치 스크립트를 사용하세요. 이 스크립트는 가상 환경을 자동으로 생성하고 `.desktop` 항목을 설치합니다.```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
bash install.sh
The script will:
apt (libgl1, python3-venv, freerdp, tigervnc…)~/.local/share/nmlinux/venv~/.local/bin/nmlinux.desktop entry so NMLinux appears in your application menuAfter install, run nmlinux from a terminal or launch it from the application menu.
Download the .whl from the latest release and install it:```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 등)를 설치해야 합니다 — 위 명령어가 이를 포함합니다. PySide6 빌드 오류로 `pipx install`이 실패하면 **옵션 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는 런타임에 `QSvgRenderer`를 통해 렌더링되는 21개의 번들 [Lucide](https://lucide.dev) SVG 아이콘을 사용합니다. 이 앱은 더 이상 시스템 아이콘 테마(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 — 이들은 Linux 등가물 대신 기본 macOS 명령어(`ifconfig`, `networksetup`, `scutil`, `pfctl`, `system_profiler` 등)를 사용합니다.
**macOS 지원이 제한적이거나 없는 모듈:**
| 모듈 | 상태 | 참고 |
|--------|--------|-------|
| **RDP** | ✓ macOS | `open rdp://`로 대체 → Microsoft Remote Desktop(App Store) |
| **VNC** | ✓ macOS | `open vnc://`로 대체 → 화면 공유(기본 내장, 설치 불필요) |
| **IP Scanner** | ✓ macOS | `socket.gethostbyaddr()` 사용 — 기본 Python, 추가 도구 불필요 |
| **SMB** | ✓ macOS | `smbclient` 대신 `smbutil view`(기본 내장) 사용 |
| **NFS** | ✓ macOS | `showmount` 기본 내장; 헤더 파싱 적응됨 |
| **Connection Manager** | ⚠ 축소됨 | 편집/삭제는 `nmcli`(Linux 전용) 필요; 목록 보기는 작동 |
### 일반
- root/polkit 통합 없음 — 상승된 권한이 필요한 도구(일부 Nmap 모드, raw 소켓)는 `sudo`로 실행해야 함; macOS에서는 권한 상승에 `osascript` + `administrator privileges` 사용
- SSH 에이전트 포워딩은 활성 SSH 에이전트(`SSH_AUTH_SOCK`)가 필요함; macOS에서는 시스템이 자동으로 처리하므로 수동 설정이 필요 없음
---
## 크레딧 및 감사의 말
- **[Anthropic](https://www.anthropic.com)** — 이 프로젝트를 구축하는 데 사용된 AI 어시스턴트, Claude Code
- 비전, 테스트 및 방향성을 제공한 저자
---
## 프로젝트 지원
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의 코드는 사용되거나 번역되지 않았습니다.
EPERMscript| 모듈 | 설명 |
|---|
| 대시보드 | 로컬 머신 정보, 게이트웨이, 공용 IP, 지리적 위치, DNS 리졸버 |
| 연결 관리자 | nmcli를 통한 NetworkManager 프로필: 목록, 필터, 연결/연결 해제/편집/삭제 |
| 인터페이스 | 인터페이스별 세부 정보가 있는 네트워크 인터페이스 테이블(ip + nmcli) |
| Wi-Fi | 사용 가능한 네트워크, 신호 막대, 보안, 연결된 네트워크 강조 표시 |
| 서브넷 계산기 | CIDR에서 네트워크/브로드캐스트/호스트 범위, 최대 4096개 항목의 호스트 테이블 |
| DNS 조회 | A, AAAA, MX, TXT, NS, CNAME, PTR, SOA, ANY에 대한 dig 기반 조회 |
| 핑 모니터 | 여러 호스트에 대한 연속 핑, RTT 통계, 패킷 손실 % |
| IP 스캐너 | CIDR/범위 핑 스캔, 50개 스레드, 호스트 이름(DNS/mDNS/NetBIOS), MAC 주소, 벤더(OUI), 인터페이스, CSV + TXT 내보내기 |
| 포트 스캐너 | TCP 연결 스캔, 200개 스레드, 서비스 사전 설정, CSV + TXT 내보내기 |
| Nmap | 7가지 스캔 모드, XML 출력 파싱, 호스트/포트/프로토콜/상태/서비스 테이블, CSV + TXT 내보내기 |
| Whois | 고정폭의 원시 whois 출력 |
| SNMP | snmpwalk/snmpget, v1/v2c, 10개 OID 사전 설정, 결과 테이블 |
| SNTP / NTP | 순수 Python RFC 4330 UDP 클라이언트, 오프셋/지연/계층/참조 |
| SSH | 내장 PTY 터미널(pyte/VT100), 저장된 연결(JSON), 키 인증, 스크롤백 |
| 원격 데스크톱 | RDP 연결 프로필(그룹/하위 그룹); xfreerdp 실행; 암호는 절대 저장되지 않음 |
| VNC | VNC 연결 프로필(그룹/하위 그룹); vncviewer(TigerVNC) 실행; macOS ARD 호환; 암호는 절대 저장되지 않음 |
| SSH 키 관리자 | ~/.ssh/ 키 쌍 나열(유형, 비트, 지문); Ed25519/RSA 4096 생성; 공개 키 복사; ssh-copy-id를 통해 서버에 배포; 확인 후 쌍 삭제 |
| TLS 검사기 | 인증서 세부 정보: CN, SAN, 발급자, 유효 기간 + 만료 카운트다운, 일련 번호, 프로토콜, 암호, 체인; 백그라운드 만료 모니터 및 사이드바 색상 점이 있는 관심 목록 |
| SMB / NFS | 모든 서버 또는 NAS에서 SMB 공유(smbclient) 및 NFS 내보내기(showmount) 목록; SMB용 선택적 자격 증명 |
| 호스트 파일 | /etc/hosts 보기/편집: 추가, 삭제, 항목 토글; 필터; pkexec로 저장 |
| 시각적 Traceroute | 세계 지도의 홉별 경로, 실시간 지리적 위치(ip-api.com), 확대/축소, CSV + TXT 내보내기 |
| MTR | 내장 My Traceroute: 홉별 손실 %, RTT 최근/평균/최고/최저/지터, 색상 코드, CSV + TXT 내보내기 |
| 방화벽 뷰어 | 읽기 전용 nftables + iptables/ip6tables 규칙 집합(루트 불필요); pkexec로 실시간; 테이블/체인/동작별 필터 |
| 속도 테스트 | Cloudflare를 통한 다운로드/업로드/핑; curl 외 외부 도구 불필요; 이력 그래프(최근 5회 실행) |
| 대역폭 | 인터페이스별 실시간 처리량: 60초 슬라이딩 그래프, 실시간 속도, 세션 합계, 최고치 |
| Wake on LAN | 순수 Python 매직 패킷(UDP 브로드캐스트), 영구 호스트 목록, 외부 도구 불필요 |
| 토폴로지 맵 | nmap -sn을 통해 LAN 장치 자동 검색; 드래그 가능한 노드, 확대/축소, 세부 패널이 있는 대화형 그래프 |
| 설정 | 언어 선택(FR / EN / ES / DE / IT / PT / JA / ZH), 영구 저장; 변경 후 재시작 필요 |
| 명령 팔레트 | Ctrl+P 오버레이: 이름 또는 키워드로 29개 모듈 전체 퍼지 검색 |
| 파일 전송 | 주문형 TFTP 또는 HTTP 서버; 구성 가능한 포트 및 루트 디렉터리; 복사 버튼으로 표시되는 로컬 IP; 실시간 로그 테이블(파일 이름, 클라이언트 IP, 방향 ↑/↓, 크기); HTTP 디렉터리 목록 + GET/POST/PUT; TFTP GET + PUT; 포트 69는 pkexec 프롬프트 표시 |
| 내보내기 | 파일 → 네트워크 보고서 내보내기(JSON/Markdown/텍스트/PDF); 인터페이스, DNS, 방화벽, SSH, 연결 페이지의 모듈별 내보내기 |
| 도구 | 기능 | Linux | macOS |
|---|
xfreerdp / xfreerdp3 | 원격 데스크톱 (RDP) | Arch: freerdp · Ubuntu ≤24.04: freerdp2-x11 · Ubuntu 26.04+: freerdp3-x11 | 선택 사항 — Microsoft Remote Desktop으로 대체 (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 |