- Shell 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| LICENSE | ||
| netsp.sh | ||
| README.md | ||
netsp = network simple probe
netsp — самостоятельный bash-скрипт (netsp) для массовой проверки доступности хостов. Умеет резолвить имена в IP, делать обратный PTR, проверять ICMP/TCP/UDP/ARP/NDP, измерять задержку, выдавать результат в человекочитаемом, CSV или JSONL-формате.
Требует bash 4.0+. Работает на любой unix-подобной системе.
Что умеет
Резолвинг
Forward DNS: имя → IPv4/IPv6. Backend выбирается автоматически из dig, host, getent. Есть флаги -4/-6 для принудительного семейства.
Reverse DNS (PTR): IP → имя. Отключается флагом --no-reverse.
Короткие имена: если задано имя без точки, подставляется домен. По умолчанию tn.tngrp.ru, переопределяется --domain, отключается --no-default-domain.
Режим --resolve-only: только DNS/PTR, без сетевых проверок.
Проверка доступности
- ICMP (--ping): через fping (быстрее, пакетно) или ping (fallback). Количество пакетов — -c N.
- TCP (-p 22,80,443): backend выбирается из трёх:
- nmap — по умолчанию, если установлен (быстро, много портов);
- nc — принудительно --use-nc;
- bash /dev/tcp — принудительно --use-tcp, fallback, если нет nmap/nc.
- UDP (-u 53,161): через nmap -sU или nc -u.
ARP/NDP (--arp):
через arping (IPv4), ip neigh (IPv4+IPv6), arp. Флаг --arp-refresh — предварительный ping для обновления neighbor cache.
Задержка
--latency включает вывод RTT. Метод выбирается через --latency-method auto|nmap|tcp|ping: nmap — берёт latency из вывода nmap; tcp — замер времени TCP connect; ping — из ping-вывода.
По умолчанию auto: nmap, если доступен; иначе TCP; иначе ping.
Backend-выбор и fallback
Скрипт сам определяет, что доступно в системе, и подбирает backend:
| Задача | Приоритет | Fallback |
|---|---|---|
| DNS | dig | host → getent |
| Ping | fping | ping |
| TCP | nmap | nc → /dev/tcp |
| UDP | nmap | nc (результат помечается как unknown) |
| ARP | arping | ip neigh → arp |
Каждый fallback сопровождается предупреждением в stderr и повышает exit code до 4 (degraded).
Опции
Вход / вывод
файл | хост входной список или одиночная цель (без аргументов — интерактив)
-f ФАЙЛ файл со списком
-o ФАЙЛ выходной файл
-n не писать выходной файл
-l ФАЙЛ лог ошибок DNS (по умолчанию errors.log)
--csv CSV-вывод через ";"
--json JSONL-вывод (по одной JSON-строке на хост)
--diff подсветить изменения статуса с прошлого запуска
Проверки
-p ПОРТЫ TCP-порты через запятую
-u ПОРТЫ UDP-порты
--ping ICMP
--arp ARP/NDP
--arp-refresh обновить neighbor cache перед ARP/NDP
--resolve-only только DNS/PTR, без проверок
-c N количество ping-пакетов
--latency показывать задержку
--latency-method auto|nmap|tcp|ping
-t СЕК таймаут (по умолчанию 1)
--nmap-timeout СЕК отдельный таймаут для nmap
-I ИНТЕРФЕЙС eth0 | auto
DNS
--domain ДОМЕН домен для коротких имён
--no-default-domain не подставлять встроенный домен
--no-reverse не делать PTR
-4 / -6 IPv4 / IPv6
Производительность
-P N параллельных задач (по умолчанию 0 = последовательно)
--force-parallel не ограничивать P (лимит 64 по умолчанию)
--delay СЕК пауза между стартами задач
--no-dedup не удалять дубли входных строк
Отладка
-v показывать ошибки DNS
--debug отладочный вывод nmap и backend-логики
-h справка
Backend
--use-nc TCP через nc
--use-tcp TCP через bash /dev/tcp
Формат вывода
Человекочитаемый (по умолчанию)
srv-01.example.com 10.0.0.5 онлайн ping:1.2ms tcp_open:22/tcp
srv-02.example.com 10.0.0.6 оффлайн tcp_timeout
10.0.0.7 10.0.0.7 неизвестно udp_unknown:161/udp(nc_unverified)
Колонки: имя, IP, статус (цветной), детали.
JSONL (--json)
{"name":"srv-01.example.com","ip":"10.0.0.5","status":"онлайн","details":"ping:1.2ms tcp_open:22/tcp","changed":false}
Одно поле на строку — легко парсить через jq и подавать в compose_inventory.py.
CSV (--csv)
srv-01.example.com;10.0.0.5;онлайн;ping:1.2ms tcp_open:22/tcp
Разделитель ;, без цветов.
Статусы
- онлайн — хотя бы одна проверка дала положительный результат.
- оффлайн — все проверки однозначно провалились.
- неизвестно — цель не резолвится, или результат проверки неоднозначен (filtered, timeout, nc-udp без верификации).
Exit codes
Код Что значит 0 ошибок нет, нет офлайн, нет unknown 1 ошибка запуска или аргументов 2 есть хотя бы один оффлайн 3 есть хотя бы один unknown 4 были fallback-зависимости, но офлайн/unknown нет
Примеры использования
Быстрая проверка одного хоста
netsp srv-01.example.com -p 22 --ping
Массовая проверка из файла с параллелизмом
netsp -f targets.txt \
-p 22,80,443 \
--ping \
-P 40 \
-t 2 \
--json -o out.jsonl
Только DNS, без сети
netsp -f targets.txt --resolve-only --json -o dns.jsonl
С ARP для локального сегмента
netsp -f targets.txt --arp --arp-refresh -P 20
С задержкой
netsp -f targets.txt -p 22 --ping --latency --latency-method nmap
Практические замечания
- Лимит параллелизма по умолчанию MAX_PARALLEL=64. Снимается --force-parallel: слишком большое -P может забить DNS-сервер и сеть.
- UDP почти всегда даёт unknown — UDP не имеет «открыт/закрыт» в явном виде. nmap -sU для open даёт определённый ответ, для open|filtered — нет. Скрипт это учитывает.
- --diff пишет кэш в ~/.cache/netsp.cache и подсвечивает изменённые с прошлого запуска статусы. Удобно при ручной отладке
- Права — UDP-сканирование и ARP требуют root или CAP_NET_RAW. Для TCP/ICMP достаточно обычного пользователя.