
- بواسطة x32x01 ||
برمجة سكربت بايثون لرؤية البورتات المفتوحة والمغلقة في موقع
هنتعلم دلوقتي إزاي نعمل سكربت بسيط ببايثون يفتح ويجرّب اتصالات على بورتات في جهاز/راوتر/سيرفر عشان يشوف البورتات المفتوحة والـ مغلقة.إيه اللي محتاجه قبل ما تبدأ؟
- بايثون 3 منصّب على جهازك.
- فهم أساسي لمكتبة socket.
- صلاحية تشغيل (لو هتجرب بورتات محمية أو فحوص متقدمة ممكن تحتاج sudo).
- وما تنساش: افتح الفحص بس على أجهزة عندك أو عندك إذن بالفحص - أي استخدام تاني ممكن يوقعك في مشاكل قانونية.
السكربت الأساسي - نسخة بسيطة وواضحة
Python:
#!/usr/bin/env python3
# simple_port_scanner.py
# استخدام: python3 simple_port_scanner.py
import socket
def scan_ports(host, start=1, end=2000, timeout=1):
print(f"Scanning {host} from port {start} to {end} (timeout={timeout}s)...\n")
open_ports = []
for port in range(start, end + 1):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
try:
result = s.connect_ex((host, port))
if result == 0:
print(f"[+] Port {port} is OPEN")
open_ports.append(port)
# لو عايز تعرض البورتات المغلقة أرسل else وطبع رسالة
except KeyboardInterrupt:
print("\n[!] Scan cancelled by user.")
break
except Exception as e:
# نتجاهل أخطاء مؤقتة عشان الفحص يكمل
pass
finally:
s.close()
print("\nScan finished.")
if open_ports:
print("Open ports:", ', '.join(map(str, open_ports)))
else:
print("No open ports found in the scanned range.")
if __name__ == "__main__":
target = input("Enter target IP or hostname: ").strip()
if not target:
print("No target provided. Exiting.")
else:
# ممكن تخلي المستخدم يدخل نطاق بورتات أو يسيبه افتراضي
scan_ports(target, start=1, end=2000, timeout=1)
شرح الكود خطوة بخطوة
- import socket - بنستخدم socket لفتح اتصالات TCP.
- scan_ports(host, start, end, timeout) - دالة بتجرّب كل بورت من start لـ end.
- داخل اللوب بنفتح socket جديد لكل بورت ونستخدم connect_ex علشان ما يرمزش exception على حاولات الفشل.
- connect_ex بيرجع 0 لما الاتصال نجح - معناه البورت مفتوح.
- بنستعمل settimeout علشان ما نستناش كتير على بورت مش موجود.
- دايماً بنقفل السوكيت في finally عشان مايتراكموش موارد مفتوحة.
نسخة أسرع بالـ threading - لو عايز تسد الوقت
لو هتفحص آلاف البورتات أو شبكة كبيرة، يفضل تستخدم خيوط (threads) لتوازي الفحص. خلي بالك من عدد الخيوط عشان متشغّلش جهازك أو الشبكة. Python:
# threaded_port_scanner.py (مقتطف)
import socket
import threading
def worker(host, port, timeout, results):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
try:
if s.connect_ex((host, port)) == 0:
results.append(port)
except:
pass
finally:
s.close()
def threaded_scan(host, start=1, end=2000, timeout=1, max_threads=100):
threads = []
results = []
for port in range(start, end + 1):
t = threading.Thread(target=worker, args=(host, port, timeout, results))
threads.append(t)
t.start()
# تحكم بسيط بعدد الخيوط
while threading.active_count() > max_threads:
pass
for t in threads:
t.join()
return sorted(results)
نصايح عملية وتحسينات ممكن تضيفها
- خلي الواجهة تقبل نطاق بورتات أو قائمة بورتات محددة.
- احفظ النتايج في CSV أو JSON للرجوع لها بعدين.
- اضف كشف الخدمة بواسطة محاولة قراءة الـ banner لو البورت مفتوح (بعض الخدمات بتبعت سطر ترحيبي).
- لو عايز تدي أولوية للفحص: ابدأ بالبورتات الشائعة (80, 443, 22, 21, 3306...) عشان تلاقي النتايج المهمة أسرع.
- لو هتعمل فحص UDP استخدم أدوات متخصصة؛ socket UDP مختلف ومتعذر.
- السكربت البسيط مفيد للتعلم ولمعرفة البورتات المفتوحة في جهازك أو الراوتر أو سيرفر عندك إذن اختباره.
- لو عايز سرعة أكبر استخدم نسخة متعددة الخيوط، لكن خلي بالك من التأثير على الشبكة.
التعديل الأخير: