اكتشاف أنظمة التشغيل والخدمات العاملة خلف الكواليس برمجياً
ماذا سنتعلم اليوم؟ في هذا الدرس، سنتعلم كيفية استخدام لغة بايثون لاكتشاف نظام التشغيل الذي نعمل عليه، وسرد العمليات الجارية، وتحديد الخدمات التي تستمع للاتصالات (المنافذ المفتوحة) برمجياً.
هذا الفهم أساسي للمراقبة الأمنية، استكشاف الأخطاء، وفهم بيئة الخادم.
الخطوة 1: تحديد نظام التشغيل
الخطوة الأولى هي تحديد نظام التشغيل الذي يعمل عليه السكربت. مكتبة platform في بايثون توفر معلومات مفصلة حول النظام الأساسي.
ملاحظة تقنية: مكتبة platform هي جزء من المكتبة القياسية في بايثون، مما يعني أنك لا تحتاج إلى تثبيتها بشكل منفصل.
إليك كيفية استخدامها:
import platform
def get_os_info():
"""تسترجع معلومات حول نظام التشغيل."""
print("--- معلومات نظام التشغيل ---")
# الحصول على اسم نظام التشغيل (مثل 'Linux', 'Windows', 'Darwin')
print(f"نظام التشغيل: {platform.system()}")
# الحصول على إصدار النظام
print(f"الإصدار: {platform.release()}")
# الحصول على تفاصيل إضافية للإصدار
print(f"تفاصيل الإصدار: {platform.version()}")
# الحصول على اسم الجهاز
print(f"اسم الجهاز: {platform.node()}")
print("----------------------------")
# استدعاء الدالة لعرض المعلومات
# get_os_info()
الخطوة 2: استعراض العمليات الجارية (Processes)
لفهم ما يحدث على النظام، نحتاج إلى معرفة العمليات التي تعمل حالياً. مكتبة psutil (اختصار لـ 'process and system utilities') هي أداة قوية لاسترداد معلومات حول العمليات واستخدام موارد النظام.
ملاحظة تقنية:psutilليست جزءاً من مكتبة بايثون القياسية. يجب تثبيتها باستخدامpip install psutilقبل البدء.
إليك كيفية سرد العمليات الأساسية:
import psutil
def list_running_processes():
"""تسرد العمليات الجارية مع معرفاتها وأسمائها."""
print("\n--- العمليات الجارية ---")
# تكرار على جميع العمليات الجارية حالياً
for proc in psutil.process_iter(['pid', 'name', 'username']):
try:
# الحصول على معلومات العملية مثل PID واسمها والمستخدم الذي أطلقها
print(f"PID: {proc.info['pid']}, الاسم: {proc.info['name']}, المستخدم: {proc.info['username']}")
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
# التعامل مع أي استثناءات قد تحدث أثناء الوصول إلى معلومات العملية
pass
print("------------------------")
# استدعاء الدالة لعرض العمليات
# list_running_processes()
الخطوة 3: اكتشاف الخدمات المفتوحة والمنافذ الاستماع (Listening Ports)
تحديد المنافذ التي تستمع للاتصالات يخبرنا عن الخدمات الشبكية النشطة على النظام. سنستخدم psutil أيضاً لهذا الغرض، مع التركيز على حالة الاتصال LISTEN.
سنحاول ربط المنفذ بعملية معينة إن أمكن.
import psutil
def discover_listening_services():
"""تكتشف الخدمات التي تستمع على منافذ معينة."""
print("\n--- الخدمات والمنافذ الاستماع ---")
# الحصول على جميع اتصالات الشبكة على النظام
for conn in psutil.net_connections(kind='inet'):
# التحقق مما إذا كانت حالة الاتصال 'LISTEN' (تستمع للاتصالات الواردة)
if conn.status == psutil.CONN_LISTEN:
# الحصول على المنفذ المحلي الذي تستمع عليه الخدمة
local_port = conn.laddr.port
process_name = "غير معروف"
# محاولة العثور على العملية المرتبطة بهذا الاتصال
if conn.pid:
try:
process = psutil.Process(conn.pid)
process_name = process.name()
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
print(f"المنفذ: {local_port}, العملية: {process_name}, PID: {conn.pid}")
print("----------------------------------")
# استدعاء الدالة لاكتشاف الخدمات
# discover_listening_services()
الكود النهائي الكامل
هذا هو السكربت الكامل الذي يجمع جميع الخطوات المذكورة أعلاه. تأكد من تثبيت psutil (pip install psutil) قبل تشغيله.
import platform
import psutil
def get_os_info():
"""تسترجع معلومات حول نظام التشغيل."""
print("--- معلومات نظام التشغيل ---")
# الحصول على اسم نظام التشغيل (مثل 'Linux', 'Windows', 'Darwin')
print(f"نظام التشغيل: {platform.system()}")
# الحصول على إصدار النظام
print(f"الإصدار: {platform.release()}")
# الحصول على تفاصيل إضافية للإصدار
print(f"تفاصيل الإصدار: {platform.version()}")
# الحصول على اسم الجهاز
print(f"اسم الجهاز: {platform.node()}")
print("----------------------------")
def list_running_processes():
"""تسرد العمليات الجارية مع معرفاتها وأسمائها."""
print("\n--- العمليات الجارية ---")
# تكرار على جميع العمليات الجارية حالياً
for proc in psutil.process_iter(['pid', 'name', 'username']):
try:
# الحصول على معلومات العملية مثل PID واسمها والمستخدم الذي أطلقها
print(f"PID: {proc.info['pid']}, الاسم: {proc.info['name']}, المستخدم: {proc.info['username']}")
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
# التعامل مع أي استثناءات قد تحدث أثناء الوصول إلى معلومات العملية
pass
print("------------------------")
def discover_listening_services():
"""تكتشف الخدمات التي تستمع على منافذ معينة."""
print("\n--- الخدمات والمنافذ الاستماع ---")
# الحصول على جميع اتصالات الشبكة على النظام
for conn in psutil.net_connections(kind='inet'):
# التحقق مما إذا كانت حالة الاتصال 'LISTEN' (تستمع للاتصالات الواردة)
if conn.status == psutil.CONN_LISTEN:
# الحصول على المنفذ المحلي الذي تستمع عليه الخدمة
local_port = conn.laddr.port
process_name = "غير معروف"
# محاولة العثور على العملية المرتبطة بهذا الاتصال
if conn.pid:
try:
process = psutil.Process(conn.pid)
process_name = process.name()
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
print(f"المنفذ: {local_port}, العملية: {process_name}, PID: {conn.pid}")
print("----------------------------------")
# تنفيذ جميع الدوال
if __name__ == "__main__":
get_os_info()
list_running_processes()
discover_listening_services()
النتيجة المتوقعة
عند تشغيل السكربت، ستحصل على مخرجات مقسمة إلى ثلاثة أقسام رئيسية:
- معلومات نظام التشغيل: يعرض اسم نظام التشغيل، إصداره، تفاصيل الإصدار، واسم الجهاز.
- العمليات الجارية: قائمة بالعمليات التي تعمل حالياً على نظامك، مع معرف كل عملية (PID)، اسمها، والمستخدم الذي أطلقها.
- الخدمات والمنافذ الاستماع: قائمة بالمنافذ التي تستمع للاتصالات الواردة (مما يشير إلى خدمات شبكية نشطة)، مع المنفذ ورقم تعريف العملية (PID) واسم العملية المرتبطة به إن أمكن.
قد تختلف المخرجات الدقيقة بناءً على نظام التشغيل الخاص بك والخدمات والعمليات التي تعمل عليه في وقت التنفيذ.
--- معلومات نظام التشغيل --- نظام التشغيل: Linux (أو Windows، Darwin) الإصدار: 5.15.0-78-generic تفاصيل الإصدار: #85-Ubuntu SMP Fri Jul 7 15:25:07 UTC 2023 اسم الجهاز: my-ubuntu-machine ---------------------------- --- العمليات الجارية --- PID: 1, الاسم: systemd, المستخدم: root PID: 2, الاسم: kthreadd, المستخدم: root ... PID: 12345, الاسم: python3, المستخدم: user ------------------------ --- الخدمات والمنافذ الاستماع --- المنفذ: 22, العملية: sshd, PID: 789 المنفذ: 80, العملية: apache2, PID: 1011 المنفذ: 3306, العملية: mysqld, PID: 1213 ... ----------------------------------