Дунаев Никита.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import subprocess
  2. import time
  3. import ipaddress
  4. import argparse
  5. def ping_ip(ip):
  6. try:
  7. result = subprocess.run(['ping', '-n', '1', ip], capture_output=True, text=True, check=True, timeout=1) #timeout added to prevent hanging
  8. return True # Успешный пинг
  9. except subprocess.CalledProcessError:
  10. return False # Ошибка пинга
  11. except subprocess.TimeoutExpired:
  12. return False #Timeout
  13. def scan_network(ip_range, timeout = 0.01):
  14. try:
  15. network = ipaddress.ip_network(ip_range)
  16. active_ips = []
  17. for ip in network.hosts():
  18. if ping_ip(str(ip)):
  19. active_ips.append(str(ip))
  20. return active_ips
  21. except ValueError:
  22. print(f"Неверный формат диапазона IP-адресов: {ip_range}")
  23. return []
  24. def monitor_network(ip_range, interval):
  25. previous_ips = []
  26. while True:
  27. current_ips = scan_network(ip_range)
  28. new_ips = set(current_ips) - set(previous_ips)
  29. lost_ips = set(previous_ips) - set(current_ips)
  30. if new_ips:
  31. print("Новые соединения:", new_ips)
  32. if lost_ips:
  33. print("Потерянные соединения:", lost_ips)
  34. previous_ips = current_ips
  35. time.sleep(0.01)
  36. if __name__ == "__main__":
  37. parser = argparse.ArgumentParser(description="Мониторинг сети (пингование) и уведомление об изменениях соединений.")
  38. parser.add_argument("ip_range", help="Диапазон IP-адресов для сканирования (например, 192.168.1.0/24)")
  39. parser.add_argument("interval", type=int, help="Интервал сканирования в секундах")
  40. args = parser.parse_args()
  41. monitor_network(args.ip_range, args.interval)