from ping3 import ping, verbose_ping
import ipaddress
from concurrent.futures import ThreadPoolExecutor, as_completed
def is_host_up(ip, timeout=1):
"""Sprawdza, czy host odpowiada na ping."""
try:
response = ping(str(ip), timeout=timeout)
return response is not None
except Exception:
return False
def scan_ip_range(base_ip, start=1, end=254, max_threads=100):
"""Skanuje zakres IP"""
base = ipaddress.ip_address(base_ip)
network_base = ipaddress.IPv4Address(int(base) & 0xFFFFFF00)
print(f"[INFO] Skanowanie zakresu {network_base}.1 do {network_base}.{end}")
active_hosts = []
with ThreadPoolExecutor(max_threads) as executor:
future_to_ip = {
executor.submit(is_host_up, ipaddress.IPv4Address(int(network_base) + i)):
ipaddress.IPv4Address(int(network_base) + i)
for i in range(start, end + 1)
}
for future in as_completed(future_to_ip):
ip = future_to_ip[future]
if future.result():
print(f"[ACTIVE] {ip}")
active_hosts.append(str(ip))
print("\n[RESULT] Aktywne hosty:")
for ip in active_hosts:
print(f" - {ip}")
if __name__ == "__main__":
# mielenie 192.168.0.1–254
scan_ip_range("192.168.0.0")
Źródło: