-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscanner.py
More file actions
76 lines (67 loc) · 2.73 KB
/
scanner.py
File metadata and controls
76 lines (67 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python3
import sys
import socket
from datetime import datetime
import concurrent.futures
import argparse
# configuration des arguments en ligne de commande
parser = argparse.ArgumentParser(description="Scanner de ports réseau rapide en Python")
parser.add_argument("target", help="L'adresse IP ou le nom de domaine à scanner (ex: 192.168.1.1 ou google.com)")
parser.add_argument("-p", "--ports", default="1-1024", help="Plage de ports (ex: 1-1000) ou liste (ex: 22,80,443)")
parser.add_argument("-t", "--timeout", type=float, default=1.0, help="Délai d'attente max par port en secondes (défaut: 1.0)")
parser.add_argument("-o", "--output", help="Nom du fichier pour sauvegarder les résultats (ex: resultats.txt)")
args = parser.parse_args()
# résolution de la cible
try:
target_ip = socket.gethostbyname(args.target)
except socket.gaierror:
print(f"Erreur : Impossible de résoudre le nom d'hôte {args.target}")
sys.exit()
# traitement de l'argument des ports
ports_to_scan = []
if "-" in args.ports:
start, end = map(int, args.ports.split("-"))
ports_to_scan = range(start, end + 1)
elif "," in args.ports:
ports_to_scan = [int(p) for p in args.ports.split(",")]
else:
ports_to_scan = [int(args.ports)]
open_ports = []
print("-" * 60)
print(f"Scan de la cible : {target_ip} ({args.target})")
print(f"Heure de début : {datetime.now()}")
print("-" * 60)
# fonction de scan avec Timeout
def scan_port(port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(args.timeout) # évite au script de bloquer sur un port silencieux
result = s.connect_ex((target_ip, port))
if result == 0:
print(f"[+] Port {port} est ouvert")
open_ports.append(port)
s.close()
except (socket.gaierror, socket.error):
pass
# on fait l'Exécution Multi-threadée
try:
with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
executor.map(scan_port, ports_to_scan)
except KeyboardInterrupt:
print("\nArrêt du programme par l'utilisateur.")
sys.exit()
# on fait l'exportation des résultats
if args.output:
try:
with open(args.output, "w") as f:
f.write(f"Résultats du scan pour {args.target} ({target_ip})\n")
f.write(f"Date: {datetime.now()}\n")
f.write("-" * 40 + "\n")
if open_ports:
for port in sorted(open_ports):
f.write(f"Port {port} : Ouvert\n")
else:
f.write("Aucun port ouvert trouvé.\n")
print(f"\n[i] Les résultats ont été sauvegardés avec succès dans '{args.output}'")
except Exception as e:
print(f"\n[!] Erreur lors de la sauvegarde du fichier : {e}")