bash-скрипт для массовой проверки доступности хостов со множеством функций
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-22 23:57:32 +10:00
LICENSE Initial commit 2026-10-10 14:32:08 +00:00
netsp.sh netsp2. drope /dev/tcp. fix bugs 2026-10-22 23:57:32 +10:00
README.md Правка README 2026-10-11 01:28:43 +10:00

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 достаточно обычного пользователя.