
مجموعة أدوات شبكات موحدة لنظام لينكس — Python 3 + PySide6
مجموعة أدوات شبكات موحّدة لنظامي Linux وmacOS — افحص، اتصل، شخّص.
NMLinux هو واجهة رسومية موحّدة تجمع 29 وحدة شبكات في نافذة واحدة: مراقبة الواجهات، Wi-Fi، DNS، محطة SSH، عارض جدار الحماية، خريطة الطوبولوجيا، traceroute، والمزيد. بُني من الصفر باستخدام Python وPySide6 (Qt 6)، مع 8 لغات للواجهة وبدون أي تبعيات خارجية تتجاوز أدوات النظام القياسية.
[!NOTE] لا علاقة لـ NMLinux بخدمة النظام الخفية
/usr/bin/NetworkManager(NetworkManager من Red Hat/GNOME). NMLinux مشروع مستقل بُني من الصفر بلغة Python وPySide6.
بُني باستخدام Claude Code (Anthropic) وبمساهمة مؤلفه.
NMLinux مبني بمساعدة الذكاء الاصطناعي — وتحديدًا Claude Code — وهذا ليس مخفيًا في أي مكان في هذا المستودع. تقريبًا كل مشروع برمجي جاد اليوم يستخدم الذكاء الاصطناعي في مكان ما من مساره، سواء ذُكر ذلك أم لا. لذا فإن سؤال "هل كان الذكاء الاصطناعي مشاركًا؟" ليس هو السؤال المهم. السؤال المهم هو: هل يوجد ما يلتقط الأخطاء عندما يُخطئ الذكاء الاصطناعي؟
وإليك ما يلتقطها، إذا كنت تفضّل التحقق بدلًا من تصديقي:
pytest tests/ -v. منطق خالص إلى جانب حفنة من اختبارات أدوات Qt الحقيقية (القوائم، الجداول)، دون إخفاء الأجزاء المهمة خلف المحاكاة.docs/Decisions-Techniques.md — كل قرار تقني غير بديهي، والبدائل التي رُفضت، والأخطاء (بما فيها تلك التي أدخلها الذكاء الاصطناعي) التي اكتُشفت وأُصلحت، مع توثيق الأسباب كتابيًا.docs/Architecture.md و docs/Carte-des-Modules.md — الهيكل الفعلي للكود، مع إبقائه متزامنًا مع ما يُطرح فعليًا.لا يوجد أي من ذلك لأن الذكاء الاصطناعي لا يُوثق به؛ بل لأنه لا ينبغي أن يُطرح أي شيء دون عملية تحقق تفحصه — بما في ذلك الكود المكتوب يدويًا. احكم على المخرجات وكيفية التحقق منها، لا على الأداة التي ساعدت في كتابتها.
وجدت خطأً رغم ذلك؟ هذا مفيد وليس محرجًا — افتح issue.
مناقشات GitHub مفتوحة — شارك ملاحظاتك، وأبلغ عن أفكارك، واطرح أسئلتك، أو ببساطة قل مرحبًا. يملك المؤلف خبرة تفوق 30 عامًا في البنية التحتية والتشغيل، وبنى هذه الأداة لأنه يجب أن توجد برمجيات جيدة ومجانية وبسيطة لنظام Linux أيضًا.
لقطات Linux من الإصدار v1.2.7 — ولقطات macOS من الإصدار v1.3.5. يضم التطبيق الآن 29 وحدة و8 لغات للواجهة (FR/EN/ES/DE/IT/PT/JA/ZH).
Linux (KDE)
| Dashboard | Topology |
|---|---|
![]() | ![]() |
| Traceroute | Wi-Fi |
|---|---|
![]() | ![]() |
macOS
| Dashboard | Traceroute |
|---|---|
![]() | ![]() |
traceroute يُحلّ دائمًا على PATH عبر غلاف المضيف (host shim) حتى عندما لا يحتوي المضيف على ثنائي traceroute حقيقي مثبّت، لذلك لم يكن العامل (worker) يتراجع أبدًا إلى tracepath وكان التتبع ينتهي فورًا دون أي قفزات ودون إظهار أي خطأ. الآن يتراجع إلى tracepath كلما لم يُنتج traceroute أي مخرجات قابلة للتحليل إطلاقًا، بغض النظر عن سبب الفشل.DISPLAY/WAYLAND_DISPLAY مضبوطة (أي جلسة رسومية) ولا يمتلك ssh طرفية tty نظيفة، فقد يحاول استخدام $SSH_ASKPASS لطلب كلمة المرور بدلًا من المحطة المدمجة — مما يفشل المصادقة بصمت إذا لم يكن هناك مساعد askpass مثبّت. الآن يفرض SSH_ASKPASS_REQUIRE=never أن تمر طلبات كلمة المرور دائمًا عبر المحطة نفسها.flatpak-spawn --host أن تصبح أبدًا مالكة طرفية التحكم (controlling terminal) للـ pty المُمرَّرة ( مرفوض مع — جلسة أخرى مختلفة وغير ذات صلة تمتلكها بالفعل؛ هذا حد أمني مقصود من النواة، وليس خطأً). الحل الوحيد (، عبر تخصيص pty جديدة) يصلح طلب كلمة المرور لكنه يكسر نقل تغيير حجم الطرفية المباشر (live resize) لتلك الجلسة — وهو مقايضة أسوأ من عدم توفير Flatpak إطلاقًا. AUR وAppImage هما مسارا التثبيت المدعومان على Linux مستقبلًا.packaging/flatpak/ يستهدف KDE Linux والتوزيعات الأخرى التي تعتمد Flatpak فقط. أدوات سطر الأوامر على المضيف التي يستدعيها nmlinux من الخارج (nmcli, pkexec, mount.cifs, ssh, nmap, …) تُربط عبر أغلفة flatpak-spawn --host على PATH بدلًا من عزل كل أداة على حدة؛ ويأتي PySide6 من io.qt.PySide.BaseApp على Flathub بدلًا من حزمة PyPI wheel. لم يُنشر على Flathub — بل تُبنى حزمة .flatpak واحدة باستخدام packaging/flatpak/build-bundle.sh وتُرفق بكل إصدار، تمامًا كما هو الحال مع AppImage. أُوقف في v1.7.12 — انظر أعلاه.Ctrl+Shift+C أو قائمة النقر بزر الماوس الأيمن؛ والصق باستخدام Ctrl+Shift+V (موجود سابقًا). كان النسخ مستحيلًا سابقًا — إذ لم تكن هناك آلية تحديد نص إطلاقًاiperf3 للعميل فقط إما ضد قائمة خوادم عامة مرفقة (26 دولة) أو خادم مخصص محفوظ (مثل خادم مؤسسة داخلي). يدعم TCP/UDP وIPv4/IPv6/تلقائي والاتجاه العكسي (تنزيل)، مع عرض التذبذب (jitter)/فقدان الحزم لاختبارات UDP. اقترحه issue #6iperf3 — ثبّته لتفعيل تبويب LAN؛ يعرض التبويب لافتة ويبقى معطّلًا بخلاف ذلك~/mnt/<host>_<share>)، قابل للاستخدام من الطرفية وأي تطبيق آخر — وليس عرض تصفح مؤقتًا. مخصص للجلسة فقط (بدون استمرارية عبر fstab/systemd)، وتُعاد استخدام بيانات الاعتماد من حقلي المستخدم/كلمة المرور الموجودين. يستخدم Linux pkexec mount -t cifs مع ملف بيانات اعتماد بصلاحيات مقيدة (لا يُكشف أبدًا عبر ps)؛ بينما يستخدم macOS mount_smbfs مباشرة. يعيد المحاولة تلقائيًا بلهجة SMB أقدم (vers=2.0) عندما يرفض الخادم التفاوض الافتراضي (شائع مع وحدات NAS الأقدم) — تحدث المحاولتان ضمن طلب مصادقة واحد عبر عملية مساعدة مخصصةcifs-utils (Linux) لتركيب SMB؛ مدمجة في macOSbootstrap_macos.sh يفرض NONINTERACTIVE=1 على مثبّت Homebrew، الذي كان يتوقف فورًا على أي حساب مسؤول جديد بدلًا من طلب كلمة مرور sudo؛ كما أن السطر الواحد الموثق يحمّل السكربت أولًا الآن بدلًا من توجيهه مباشرة إلى bash، لأن الخطوات التفاعلية المتداخلة (مثبّت Xcode CLT، وطلب sudo الخاص بـ Homebrew) يمكن أن تتعارض مع دفق الإدخال الخاص بالسكربت الخارجي عند التوجيه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 + بدء تلقائي)، Port Scanner (set_target + تركيز)، SSH / RDP / VNC (set_target يفتح نموذج اتصال جديد معبأ مسبقًا)، Topology (load_hosts يحقن العقد من فحص IP Scanner/Nmap دون إعادة فحص — تُكتشف البوابة تلقائيًا، وتُرسم الحواف، وتُميَّز عقدة المصدر بالأحمر)، Asset Inventory (prefill_hosts يبدأ فحص بيانات الاعتماد مباشرة على المضيفات المكتشفة، ويتجاوز مرحلة اكتشاف ICMP)exec() إلى Python، يُحل NSBundle.mainBundle() إلى حزمة Python.framework (CFBundleName = "Python") التي يقرؤها Qt أثناء إنشاء QApplication؛ أُصلح بتعديل infoDictionary() الخاصة بالحزمة وإعادة تسمية عناصر القوائم الأصلية عبر AppKit قبل إنشاء قائمة التطبيقNSProcessInfo.setProcessName_ عبر pyobjc-framework-Cocoa (استُبدلت بـ v1.6.4)install_macos_app.sh حتى يربط macOS حزمة .app بشكل صحيح بالعملية الجارية؛ مع إضافة setprogname وتجاوز sys.argv[0] كحلول احتياطية|؛ سلسلة تراجع كاملة دون صلاحيات المسؤول: نظام التشغيل عبر ver، المعالج عبر سجل النظام، الذاكرة عبر systeminfo، القرص عبر wmic → fsutil (يراعي الإعدادات المحلية: فاصلة EN / مسافة FR) → dir /-C/System/Volumes/Data)، وتراجع معالج Apple Silicon (hw.model)، وSynology (/volume1)، وUnraid (/mnt/user)sshpass وnmap وsnmpget المثبتة عبر Homebrew تُعثر عليها وتُستدعى باستخدام مسارها المطلق؛ حزم .app على macOS لا ترث PATH الخاص بـ Homebrew (/opt/homebrew/bin، /usr/local/bin)، لذلك كانت الأدوات المثبتة مسبقًا تُتجاهل بصمتgit pull && bash packaging/install_macos_app.sh من جذر المستودع هو طريقة الترقية الموثقة؛ يدير السكربت بيئته الافتراضية الخاصة (~/.local/share/nmlinux/venv) ولا يتطلب pip أو pipx على مستوى النظامfree -h بـ free المتوافق مع BusyBox؛ مسار كود macOS يستخدم الآن sw_vers لاسم نظام التشغيل، مع تراجع hw.model لمعالج Apple Silicon، و/System/Volumes/Data لحجم بيانات مستخدم APFS؛ اكتشاف وحدات تخزين Synology/Unraid (/volume1، /mnt/user) قبل الجذر؛ إصلاح نمط النجاح الكاذب df | tail -1 || … باستخدام حُراس test -d؛ تجريد مخرجات lsb_release من علامات الاقتباس المحيطة؛ دعم مجموعات متعددة من بيانات اعتماد SSH/WinRM (تجريب كل واحدة بالترتيب لكل مضيف)tftpyssl.SSLError؛ تعرض الإدخالات الآن "… (checking)" أثناء تشغيل الفحص في الخلفية و"— (unreachable)" عندما يتعذر الوصول إلى المضيف+ Watch (يستخدم المضيف/المنفذ الحالي) أو يدويًا في اللوحة؛ يعمل الفحص الخلفي تلقائيًا بعد ثانيتين من الإطلاق؛ يعرض إدخال "TLS Inspector" في الشريط الجانبي نقطة ملونة: حمراء إذا انتهت صلاحية أي شهادة، وبرتقالية إذا انتهت صلاحية أي شهادة خلال 30 يومًا؛ زر إعادة فحص في اللوحة؛ تعرض القائمة حالة كل إدخال (✓ / ⚠ / EXPIRED) مع ترميز لوني_arp_entry() الآن arp -n <ip> على macOS ويحلل تنسيق مخرجاته (? (IP) at AA:BB:CC on en0) بدلًا من قراءة /proc/net/arp (خاص بـ Linux)؛ تُملأ أعمدة الماسح الأربعة الآن بشكل صحيح على macOSgetent (خاص بلينكس) لصالح socket.gethostbyaddr() في بايثون لإجراء تحليل عكسي لـ DNS عبر المنصات؛ أصبح البحث عن اسم المضيف يعمل أصليًا على macOS دون أي أدوات إضافيةsmbclient (يتطلب samba عبر Homebrew) إلى smbutil view (أداة مدمجة في macOS)؛ أصبح عرض قائمة مشاركات SMB يعمل على macOS دون أي تثبيتshowmount مدمج في macOS لكنه لا يدعم --no-headers؛ تمت إزالة العلامة على macOS وتجاوز سطر الترويسة في المحلّل؛ أصبح عرض قائمة صادرات NFS يعمل بشكل أصليxfreerdp، يعود إلى مخطط عناوين open rdp://؛ يفتح تطبيق Microsoft Remote Desktop (من App Store) إذا كان مثبتًا، مع تعبئة مسبقة للمضيف والمنفذ واسم المستخدم والمجالvncviewer، يعود إلى مخطط عناوين open vnc://؛ يفتح مشاركة شاشة macOS (مدمجة، لا تتطلب أي تثبيت)-A إلى أمر ssh؛ تتيح التنقل بين الخوادم دون نسخ مفتاحك الخاص (PC → A → B)؛ تتطلب وكيل SSH نشطًا (SSH_AUTH_SOCK)؛ تم تحديث المساعدة السياقية في جميع اللغات الثمانيpip install reportlab)printer, server, smartphone, cpu, laptop)avahi-browse (اختياري، يعمل بالتوازي مع فحص nmap)؛ يحدد الطابعات (_ipp._tcp, PDL Printer)، هواتف وأجهزة تلفاز أندرويد (_googlecast._tcp, _androidtvremote2._tcp)، أجهزة Mac من Apple (طراز am=Mac16,x في AirPlay TXT)، أجهزة NAS (تقرير Synology model=Xserve)، أجهزة KDE Connect المكتبية؛ يتراجع إلى OUI لبائع MAC وحدسيات اسم المضيف عندما يكون avahi غير متاح_IS_MACOS) وتتفرع إلى أوامر macOS الأصلية: route -n get default, ifconfig, scutil --dns, networksetup, system_profiler SPAirPortDataType, pfctl, netstat -ib؛ تستخدم رفع الصلاحيات osascript + with administrator privileges بدلاً من pkexec؛ يستخدم خط monospace Menlo بدلاً من Monospace? (الوصف، أمثلة الاستخدام، وأوامر CLI المكافئة) الآن جميع اللغات الثماني لكل وحدة؛ سابقًا كانت JA وZH تتراجعتان إلى الإنجليزيةnav_hint_smb_nfs وnav_hint_hosts إلى جميع الكتل اللغوية السبع غير الفرنسية~/.ssh/ (الملف، النوع، البتات، التعليق، بصمة SHA256)؛ إنشاء مفاتيح Ed25519 أو RSA 4096 مع عبارة مرور اختيارية (كشف عدم التطابق، اسم ملف تلقائي حسب النوع)؛ نسخ المفتاح العام إلى الحافظة؛ نشره إلى خادم بعيد عبر ssh-copy-id في طرفية مدمجة مع دعم stdin لطلبات كلمة المرور؛ حذف أزواج المفاتيح مع تأكيد؛ إنشاء ~/.ssh/ تلقائيًا إذا كان مفقودًا؛ تدويل: fr / en / es / deopenssl s_client)؛ يعمل مع الشهادات الصالحة والمنتهية والموقّعة ذاتيًا؛ رسائل خطأ واضحة للمضيفين غير المتاحينsmbclient -L مع بيانات اعتماد اختيارية، يعرض اسم المشاركة / النوع / التعليق؛ تبويب NFS: showmount -e، يعرض مسار التصدير وقائمة الوصول؛ يكتشف الأدوات المفقودة مع تعليمات تثبيت خاصة بكل توزيعة/etc/hosts؛ جدول مع مفتاح تمكين/تعطيل، إضافة/تعديل/حذف إدخالات عبر حوار؛ تصفية حسب IP أو اسم المضيف؛ الحفظ عبر pkexec cp (حوار مصادقة polkit)~/.local/share/nmlinux/venv، يثبّت التبعيات النظامية عبر apt، وينشئ مشغّلًا وإدخال .desktop (يصلح خطأ PEP 668 externally-managed-environment)vncviewer (TigerVNC)؛ متوافقة مع macOS ARD (مصادقة DH30 يعالجها vncviewer أصليًا)؛ كلمة المرور لا تُخزَّن أبدًا؛ تكتشف غياب vncviewer مع تعليمات تثبيت خاصة بكل توزيعةxfreerdp كعملية خارجية؛ تُطلب كلمة المرور عند الاتصال ولا تُخزَّن أبدًا؛ الحقول: المضيف، المنفذ، اسم المستخدم، المجال، الدقة، ملء الشاشة؛ تكتشف غياب xfreerdp مع تعليمات تثبيت خاصة بكل توزيعة (Arch / Debian / Fedora)assets/icons/؛ تُعرض في وقت التشغيل عبر QSvgRenderer؛ ملوّنة بـ #60a5fa؛ لم يعد التطبيق يتطلب أي سمة أيقونات للنظام (Breeze، Adwaita، Papirus…)main.py يكتشف الآن تلقائيًا سمة أيقونات GTK عبر gsettings ويطبقها على Qt؛ سلاسل احتياطية موسعة لـ Wi-Fi وTraceroute وSpeed Test وInterfaces وPort Scanner وFirewall وMTR؛ تتحقق themed_icon() الآن من وجود pixmap حقيقي قبل قبول أيقونة السمةqt6.qtsvg إلى QT_PLUGIN_PATH ليتمكن Qt من عرض أيقونات SVG؛ تحاول themed_icon() الأحجام 22/24/16/32/48 (Breeze يستخدم 22 بكسل، وليس 24)؛ يتم فرض السمة breeze عند اكتشاف مجموعة الأيقونات المدمجة في Nix؛ يتحقق أيضًا من /etc/xdg/kdeglobals لإعدادات KDE على مستوى النظامmtr --report، يحلل مخرجات النص، ويعرض جدولًا مباشرًا مع نسبة الفقدان % وRTT آخر/متوسط/أفضل/أسوأ/تذبذب لكل قفزة، ملوّنًا حسب شدة الفقدان؛ وضع مستمر؛ تصدير CSV + TXTcurl + Cloudflare (speed.cloudflare.com): تنزيل (25 MB)، رفع (10 MB)، ping إلى 1.1.1.1؛ حتى 5 عمليات تشغيل محفوظة في JSON؛ رسم بياني خطي للتاريخ (تنزيل/رفع)/etc/nftables.conf و/etc/iptables/*.rules دون صلاحيات الجذر؛ مجموعة قواعد مباشرة عبر pkexec nft list ruleset؛ الأعمدة: الجدول / السلسلة / القاعدة / المنفذ / الإجراء / التعليق؛ إجراءات ملوّنة؛ تصفية مباشرة? خفيفة؛ يظهر عند التحويم تلميح يصف ما تفعله الوحدة؛ أُضيف فاصل عمودي بين الشريط الجانبي ومنطقة المحتوىcore/theme.py جديد مع is_dark(), color_ok(), color_err()؛ أدوات الرسم المخصصة (_Graph, _MapWidget) تقرأ اللوحة وقت الرسم؛ استُبدلت جميع ألوان Catppuccin Mocha المثبتة برمجيًا بأدوار لوحة Qt الدلالية255.255.255.0) المشتق من بادئة CIDRtraceroute / tracepath)getent/avahi/nmblookup؛ عنوان MAC، البائع (إدخالات IEEE OUI 39K)، أعمدة الواجهة؛ تحديث تصدير CSV/TXTالإصدار العام الأول — 13 وحدة: Dashboard، Interfaces، Wi-Fi، Subnet Calculator، DNS Lookup، Ping Monitor، IP Scanner، Port Scanner، 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 مدمجة، لا حاجة للتثبيت. البحث عن بائع OUI في IP Scanner لا يتطلب تثبيتًا أيضًا — يتم تنزيل قاعدة بيانات Wiresharkmanufتلقائيًا في الخلفية عند أول استخدام وتُخزَّن محليًا في الذاكرة المؤقتة.
pip install pyte أو sudo pacman -S python-pyte)pip install tftpy أو sudo pacman -S python-tftpy) — وحدة نقل الملفاتyay -S nmlinux
All dependencies (PySide6, ptyprocess, pyte, nmcli, …) are handled automatically.
### Option 2 — NixOS / Nix
Run directly with the bundled `flake.nix` — no system-wide install needed:```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
nix run .
أو أدخل صدفة تطوير:```bash nix develop python3 -m nmlinux.main
جميع التبعيات الخاصة ببايثون (PySide6, ptyprocess, pyte, tftpy) والأدوات النظامية (nmcli, nmap, freerdp, vncviewer, mtr, avahi-browse…) يتم توفيرها تلقائيًا عبر غلاف Nix.
### الخيار 4 — AppImage (أي توزيعة لينكس، بدون تثبيت)
قم بتنزيل `NMLinux-x.y.z-x86_64.AppImage` من [الإصدار الأحدث](https://github.com/thongor77/nmlinux/releases/latest):```bash
chmod +x NMLinux-*.AppImage
./NMLinux-*.AppImage
لا يلزم التثبيت — Python وQt وجميع وحدات NMLinux مضمّنة في ملف واحد.
يعمل على أي Linux بمعمارية x86_64 مع glibc 2.17+ (Ubuntu 16.04+, Fedora 26+, Arch, Mint، إلخ).
أدوات الشبكة النظامية (
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 Developer أو توثيقًا مدفوعًا — إنه نفس البرنامج النصي مفتوح المصدر
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
للتحديث: `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` — فحص SSID لشبكات Wi-Fi
- `pyobjc-framework-CoreLocation` — إذن خدمات الموقع لأسماء شبكات Wi-Fi
**Wi-Fi على macOS 26 (Tahoe):** عند أول تشغيل، سيطلب 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~/.local/bin/nmlinux.desktop بحيث يظهر NMLinux في قائمة التطبيقات لديكبعد التثبيت، شغّل nmlinux من الطرفية أو أطلقه من قائمة التطبيقات.
حمّل ملف .whl من أحدث إصدار وقم بتثبيته:```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 وغيرها) أولاً — الأوامر أعلاه تغطيها. إذا فشل `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
انسخ ملف .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 أيقونة SVG مدمجة من [Lucide](https://lucide.dev) تُعرض وقت التشغيل عبر `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://` → Screen Sharing (مدمجة، بدون أي تثبيت) |
| **IP Scanner** | ✓ macOS | يستخدم `socket.gethostbyaddr()` — Python أصلي، بدون أدوات إضافية |
| **SMB** | ✓ macOS | يستخدم `smbutil view` (مدمج) بدلاً من `smbclient` |
| **NFS** | ✓ macOS | `showmount` مدمج؛ تم تكييف تحليل الترويسة |
| **Connection Manager** | ⚠ محدودة | يتطلب التحرير/الحذف استخدام `nmcli` (Linux فقط)؛ عرض القائمة يعمل |
### عام
- لا يوجد تكامل مع root/polkit — الأدوات التي تتطلب صلاحيات مرتفعة (بعض أوضاع Nmap، raw sockets) يجب تشغيلها باستخدام `sudo`؛ أما على macOS فيتم تصعيد الصلاحيات عبر `osascript` + `administrator privileges`
- يتطلب إعادة توجيه وكيل SSH وجود وكيل SSH نشط (`SSH_AUTH_SOCK`)؛ على macOS يتولى النظام ذلك تلقائياً، دون الحاجة إلى أي إعداد يدوي
---
## الشكر والتقدير
- **[Anthropic](https://www.anthropic.com)** — 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/HEAD/LICENSE).
هذا المشروع إعادة تنفيذ مستقلة. لم يتم استخدام أو نقل أي كود من NETworkManager.
TIOCSCTTYEPERMscript| الوحدة | الوصف |
|---|
| Dashboard | معلومات الجهاز المحلي، البوابة، IP العام، تحديد الموقع الجغرافي، محللات DNS |
| Connection Manager | ملفات تعريف NetworkManager عبر nmcli: سرد، تصفية، اتصال/قطع/تعديل/حذف |
| Interfaces | جدول واجهات الشبكة مع تفاصيل لكل واجهة (ip + nmcli) |
| Wi-Fi | الشبكات المتاحة، أشرطة الإشارة، الأمان، تمييز الشبكة المتصلة |
| Subnet Calculator | نطاق الشبكة/البث/المضيفين من CIDR، جدول مضيفين يصل إلى 4096 إدخالًا |
| DNS Lookup | بحث قائم على dig للسجلات A، AAAA، MX، TXT، NS، CNAME، PTR، SOA، ANY |
| Ping Monitor | ping مستمر لعدة مضيفين، إحصائيات RTT، نسبة فقدان الحزم % |
| IP Scanner | فحص ping لـ CIDR/نطاق، 50 خيطًا، اسم المضيف (DNS/mDNS/NetBIOS)، عنوان MAC، البائع (OUI)، الواجهة، تصدير CSV + TXT |
| Port Scanner | فحص اتصالات TCP، 200 خيطًا، إعدادات مسبقة للخدمات، تصدير CSV + TXT |
| Nmap | 7 أوضاع فحص، تحليل مخرجات XML، جدول المضيف/المنفذ/البروتوكول/الحالة/الخدمة، تصدير CSV + TXT |
| Whois | مخرجات whois الخام بخط أحادي المسافة |
| SNMP | snmpwalk/snmpget, v1/v2c، 10 إعدادات مسبقة لـ OID، جدول النتائج |
| SNTP / NTP | عميل UDP بلغة بايثون خالصة وفق RFC 4330، الإزاحة/التأخير/الطبقة/المرجع |
| SSH | طرفية PTY مدمجة (pyte/VT100)، اتصالات محفوظة (JSON)، مصادقة بالمفتاح، سجل تمرير |
| Remote Desktop | ملفات تعريف اتصالات RDP (مجموعات/مجموعات فرعية)؛ يشغّل xfreerdp؛ كلمة المرور لا تُخزَّن أبدًا |
| VNC | ملفات تعريف اتصالات VNC (مجموعات/مجموعات فرعية)؛ يشغّل vncviewer (TigerVNC)؛ متوافق مع macOS ARD؛ كلمة المرور لا تُخزَّن أبدًا |
| SSH Key Manager | سرد أزواج مفاتيح ~/.ssh/ (النوع، البتات، البصمة)؛ إنشاء Ed25519/RSA 4096؛ نسخ المفتاح العام؛ النشر إلى خادم عبر ssh-copy-id؛ حذف الأزواج مع تأكيد |
| TLS Inspector | تفاصيل الشهادة: CN، SANs، المُصدر، الصلاحية + العد التنازلي للانتهاء، الرقم التسلسلي، البروتوكول، التشفير، السلسلة؛ Watchlist مع مراقبة انتهاء خلفية ونقطة لونية في الشريط الجانبي |
| SMB / NFS | سرد مشاركات SMB (smbclient) وصادرات NFS (showmount) من أي خادم أو NAS؛ بيانات اعتماد اختيارية لـ SMB |
| Hosts File | عرض/تحرير /etc/hosts: إضافة وحذف وتبديل الإدخالات؛ تصفية؛ حفظ عبر pkexec |
| Visual Traceroute | مسار قفزة بقفزة على خريطة العالم، تحديد جغرافي مباشر (ip-api.com)، تكبير وتحريك، تصدير CSV + TXT |
| MTR | My Traceroute مدمج: نسبة الفقدان %، RTT آخر/متوسط/أفضل/أسوأ/تذبذب لكل قفزة، ملوّن، تصدير CSV + TXT |
| Firewall Viewer | مجموعة قواعد nftables + iptables/ip6tables للقراءة فقط (بدون جذر)؛ مباشر عبر pkexec؛ تصفية حسب الجدول/السلسلة/الإجراء |
| Speed Test | تنزيل/رفع/ping عبر Cloudflare؛ لا حاجة لأداة خارجية غير curl؛ رسم بياني للتاريخ (آخر 5 عمليات تشغيل) |
| Bandwidth | إنتاجية لحظية لكل واجهة: رسم بياني منزلق 60 ثانية، سرعات مباشرة، إجماليات الجلسة، ذروة |
| Wake on LAN | حزمة سحرية بلغة بايثون خالصة (بث UDP)، دفتر مضيفين دائم، لا يتطلب أداة خارجية |
| Topology Map | يكتشف أجهزة الشبكة المحلية تلقائيًا عبر nmap -sn؛ رسم بياني تفاعلي بعقد قابلة للسحب، تكبير/تحريك، لوحة تفاصيل |
| Settings | اختيار اللغة (FR / EN / ES / DE / IT / PT / JA / ZH)، محفوظ؛ إعادة تشغيل مطلوبة بعد التغيير |
| Command Palette | تراكب Ctrl+P: بحث تقريبي عبر جميع الوحدات الـ29 بالاسم أو الكلمة المفتاحية |
| File Transfer | خادم TFTP أو HTTP عند الطلب؛ منفذ ودليل جذر قابلان للتهيئة؛ عناوين IP المحلية كأزرار نسخ؛ جدول سجل مباشر (اسم الملف، IP العميل، الاتجاه ↑/↓، الحجم)؛ قائمة دليل HTTP + GET/POST/PUT؛ TFTP GET + PUT؛ المنفذ 69 يستدعي pkexec |
| Export | ملف ← تصدير تقرير الشبكة (JSON/Markdown/Text/PDF)؛ تصدير لكل وحدة في Interfaces، DNS، Firewall، SSH، Connections |
| الأداة | الميزة | 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 |