Создание простого Ping Sweeper на Python — пошаговый мини-проект

Python — универсальный язык программирования, подходящий для создания GUI и CLI приложений. Для закрепления навыков новичку полезно работать над небольшими проектами. Один из удобных стартовых проектов — ping sweeper: простая утилита для проверки сети. Она охватывает базовые приёмы программирования: ввод/вывод, циклы, функции и работу с внешними командами.
Что такое ping sweeper
Ping sweeper — программа, принимающая адрес сети или одиночный IPv4‑адрес, посылающая ICMP‑эхо (ping) по всем хостам в подсети и выводящая списки доступных (alive) и недоступных (dead) хостов. Это быстрый способ оценить число онлайн‑устройств в локальной сети и получить их IPv4‑адреса.
Кратко: ping sweeper перебирает последние октеты адресов (обычно 1–254 в /24) и помечает ответившие машины.
Важно: сканируйте только сети, которым вы владеете или на которые у вас есть явное разрешение. Нелегитимные сканирования могут нарушать правила провайдера или законы.
Чему вы научитесь
- приёмы разбора IPv4‑адресов и подсетей;
- запуск внешней команды (ping) из Python;
- обработка возвратных кодов и таймаутов;
- простая многопоточность для ускорения сканирования;
- кроссплатформенные нюансы (Linux/macOS vs Windows);
- варианты повышения надёжности (subprocess, ipaddress, scapy, nmap).
Предварительные требования
Убедитесь, что у вас установлен Python 3.6+ и вы можете запускать его из терминала или командной строки:
python --versionНа некоторых системах команда может быть python3:
python3 --versionЕсли команда не найдена — установите Python с официального сайта или через пакетный менеджер вашей ОС.
Минимальная реализация: разбор входа и простая логика
Разобьём задачу на части:
- Принять IPv4‑адрес от пользователя.
- Получить «сетевой ID» — первые три октета для /24 (например, 192.168.1.).
- Перебрать последние октеты 1–254, отправляя по одному ping на адрес и фиксируя статус.
Простейший фрагмент (оригинальная, минималистичная идея):
import os
IP = input("[+] Enter the Host IP Address:\t")
print("[+] Starting Ping Sweeper on " + IP)
dot = IP.rfind(".")
IP = IP[0:dot + 1]
for i in range(1, 255):
host = IP + str(i)
response = os.system("ping -c 1 -w 1 " + host + " >/dev/null")
if response == 0:
print(host + " is up")
else:
print(host + " is down")Пояснения:
- input() получает строку от пользователя;
- rfind(‘.’) возвращает индекс последней точки — с его помощью сохраняем первые три октета;
- os.system() запускает команду ping; код завершения 0 означает успех (ответ);
- параметры ping (-c и -w) и синтаксис перенаправления вывода (>/dev/null) применимы для Unix‑подобных систем.
Улучшенная кроссплатформенная реализация с subprocess и таймаутом
os.system полезен для простых задач, но subprocess даёт контроль над выводом, исключениями и возвратными кодами. Ниже — реализация, которая:
- работает на Linux/macOS и Windows;
- использует subprocess.run с подавлением вывода;
- возвращает списки живых и мёртвых хостов.
import platform
import subprocess
def ping_host(host):
system = platform.system().lower()
if system == 'windows':
cmd = ['ping', '-n', '1', '-w', '1000', host]
else:
# Linux/macOS: -c 1 (один пакет), -W 1 (таймаут в секундах на ответ)
cmd = ['ping', '-c', '1', '-W', '1', host]
try:
result = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
return result.returncode == 0
except Exception:
return False
if __name__ == '__main__':
base = input('[+] Enter the Host IP Address: ')
dot = base.rfind('.')
base = base[:dot + 1]
alive = []
dead = []
for i in range(1, 255):
host = base + str(i)
if ping_host(host):
alive.append(host)
else:
dead.append(host)
print('\nAlive hosts:')
for h in alive:
print(h)
print('\nDead hosts:')
for h in dead:
print(h)Примечание: опции ping могут отличаться в разных реализации (например, macOS, BSD, GNU), поэтому при переносе на новую платформу проверьте man ping.
Быстрее: многопоточность с ThreadPoolExecutor
Последовательное опрашивание 254 адресов может занять много времени. Простая оптимизация — параллелить запросы. Ниже пример с concurrent.futures:
from concurrent.futures import ThreadPoolExecutor, as_completed
def scan_network(base, workers=50):
alive = []
dead = []
with ThreadPoolExecutor(max_workers=workers) as ex:
futures = {ex.submit(ping_host, base + str(i)): i for i in range(1, 255)}
for fut in as_completed(futures):
i = futures[fut]
host = base + str(i)
try:
if fut.result():
alive.append(host)
else:
dead.append(host)
except Exception:
dead.append(host)
return alive, dead
# использование:
# a, d = scan_network('192.168.1.')Подсказки:
- Значение workers стоит выбирать в зависимости от сети и машины (20–200). Слишком много потоков может вызвать нагрузку.
- ThreadPool подходит для задач ввода/вывода (IO bound), таких как вызовы внешних команд.
Более корректный разбор подсетей: модуль ipaddress
Если на вход может поступать CIDR (например, 192.168.1.0/24), используйте модуль ipaddress:
import ipaddress
net = ipaddress.ip_network('192.168.1.0/24')
for host in net.hosts(): # пропускает сетевой адрес и broadcast
print(str(host))Это избавляет от ошибок парсинга и позволяет поддерживать другие маски сети.
Альтернативные подходы и когда они полезны
- scapy — гибкая библиотека для низкоуровневой сетевой работы: позволяет формировать ICMP‑пакеты, проводить ARP‑сканирование для локальных сегментов и анализировать ответы. Требует прав администратора/рут.
- nmap — готовый инструмент для быстрого и надёжного сканирования сети; лучше для глубокого аудита и опознания сервисов.
- ARP‑ping — часто надёжнее внутри L2‑сети, т.к. маршрутизаторы/брандмауэры могут блокировать ICMP.
Когда простая пинг‑проверка не сработает
- Хосты блокируют ICMP (файрвол/брандмауэр). Тогда ping вернёт «down», хотя устройство онлайн.
- Маршрутизатор/провайдер фильтрует ICMP или снижает приоритет.
- Сетевые устройства в гостевой/изолированной VLAN не отвечают на пинги с вашей точки.
- Ограничения частоты на сетевых устройствах (rate limiting) — при агрессивном параллельном сканировании ответы могут теряться.
Безопасность и приватность
Важно: выполняйте сканирование только с разрешения владельца сети. В корпоративной среде согласуйте сканирование с сетевой командой. Архивируйте логи и соблюдайте внутренние политики безопасности.
Пример вывода
[+] Starting Ping Sweeper on 192.168.1.10
192.168.1.1 is up
192.168.1.2 is down
192.168.1.3 is up
...
Alive hosts:
192.168.1.1
192.168.1.3
Dead hosts:
192.168.1.2
...Дополнительные улучшения и опции
- Сохранение результата в CSV/JSON для дальнейшего анализа.
- Параметры командной строки: указать подсеть в CIDR, задать количество потоков, таймаут.
- Обработка ошибок: логирование исключений, повтор попытки для ненадёжных хостов.
- Throttling: вставлять короткие паузы между батчами для обхода rate limiting.
- GUI/веб‑интерфейс: обёрнуть в простую веб‑страницу для просмотра списков.
План тестирования и критерии приёмки
Критерии приёмки:
- Сканирование /24 должно проверять хосты 1–254 и возвращать списки alive/dead.
- Скрипт корректно работает на Linux и Windows (базовая проверка).
- Для известных ответивших хостов результат — alive; для отключённых — dead.
- Ошибки внешних команд обрабатываются без падения приложения.
Тесты/сценарии:
- Локальная сеть с 1–3 активными хостами — проверить правильность списков.
- Блокировка ICMP на виртуальной машине — убедиться, что хост помечается как dead.
- Передача сети в виде CIDR (192.168.0.0/24) — все адреса перебираются правильно.
Чеклисты для разных ролей
Для студента:
- Python 3 установлен
- Скрипт запускается из терминала
- Результаты читаемы
- Понимание, почему ping может возвращать false negative
Для системного администратора:
- Согласование сканирования с политиками
- Ограничение частоты и контроль потоков
- Логирование и хранение результатов
- Использование ARP/nmap при необходимости
Фактбокс: важные числа
- IPv4 адрес состоит из 4 октетов (например, 192.168.1.10).
- Сеть /24 обычно содержит 256 адресов, из которых 254 используются для хостов (1–254).
- Типичный диапазон при переборе последних октетов: 1–254.
Когда использовать другие инструменты
- Для разведки и определения сервисов используйте nmap.
- Для точечных, локальных MAC‑уровневых проверок — ARP‑сканирование (например, arp-scan или scapy).
- Для интеграции в сетецентричные приложения — применять Python‑модули (scapy, python-nmap) и обрабатывать результаты программно.
Короткая методология разработки (mini‑SOP)
- Определить целевой формат входа (IP или CIDR).
- Выбрать способ опроса (ping через subprocess, scapy, nmap).
- Реализовать базовую проверку и вывести результаты.
- Добавить многопоточность и тесты.
- Проверить кроссплатформенность и безопасность.
- Документировать и подготовить пояснения для пользователей.
Локальные нюансы и советы (для русскоязычных пользователей)
- В Windows в командной строке вместо >/dev/null используется >nul.
- Если скрипт запускается в корпоративной сети, уточняйте у сетевой команды, разрешено ли сканирование.
- Для работы с raw‑сокетами (scapy) требуются права администратора/root.

Резюме
Создание ping sweeper — полезный мини‑проект для изучения Python и сетевых основ. Начните с простой реализации через subprocess, затем улучшайте: поддержка CIDR через ipaddress, многопоточность, запись результатов и обработка ошибок. При необходимости переходите к scapy или nmap для более глубокого анализа.
Важно: всегда соблюдайте правила и законы при сетевом сканировании.
Ключевые шаги: принять ввод, распарсить сеть, опросить адреса, обработать результаты, логировать и документировать. Удачи в развитии проекта!
Похожие материалы
Сохранить письмо Outlook в PDF — быстро и просто
Редактирование PDF в Canva: быстро и просто
Scribble на iPad: настройка и советы для Apple Pencil
Открывать PDF на последней странице — быстро и просто
Сноски и концевые сноски в Word: подробное руководство