Передо мной встала задача - проверить занятые IP-адреса в локальной сети IPv4. С этой задачей отлично справится программа nmap, однако устанавливать любое дополнительное программное обеспечение не было возможности. Поэтому я написал Shell скрипт, который быстро выполнил то, что мне требовалось. Возможно, что он будет полезен и вам.
Скопируйте код скрипта в текстовый файл и сохраните его, например, под именем testip.sh.
#!/bin/sh
pingf()
{
if ping -w 2 -q -c 1 "$1" > /dev/null; then
echo "IP $1 is busy"
fi
}
if [ -n "$1" ]; then
NET=$(echo "$1" | grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b")
fi
NET=${NET:-$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/' | cut -f 1-3 -d .)}
H1=$(($2 + 0))
H2=$(($3 + 0))
if [ "$H1" -lt 1 ] || [ "$H1" -gt 254 ]; then
H1=1
fi
if [ "$H2" -lt 1 ] || [ "$H2" -gt 254 ]; then
H2=254
fi
I=$H1; while [ $I -le $H2 ]; do
pingf "$NET.$I" &
I=$(($I + 1))
done | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
wait
Скрипт принимает три необязательные параметра:
- адрес сети - обязательно указать первые три октета в десятичном виде, разделённые точками. По умолчанию принимает значение, вычисленное по IP-адресу первого сетевого подключения;
- начальный номер хоста - идентификатор хоста, с которого начинается проверка. Принимает значение в десятичном виде от 1 до 254, значение по умолчанию 1;
- конечный номер хоста - идентификатор хоста, на котором заканчивается проверка. Принимает значение в десятичном виде от 1 до 254, значение по умолчанию 254.
Важно! Скрипт считает размер сетевого префикса равным 24 битам, это значит, что при проверке всего диапазона IP-адресов будут проверены 254 хоста. Номера хостов 0 и 255 не проверяются, так как:
- 0 - используется для определения IP-адреса сети;
- 255 - широковещательный адрес сети (для сети 192.168.0.0 с маской подсети 255.255.255.0).
Это необходимо учитывать при проверке занятых IP-адресов в подсетях, задавая самостоятельно диапазон для начального и конечного хостов.
./testip.sh
В результате выполнение скрипта будут просканированы хосты с 1 по 244 в сети, к которой подключён первый сетевой интерфейс машины, с которой запускается его выполнение.
Если вам требуется проверить занятые IP-адреса в сети 10.205.236.0/24 начиная с хоста 1 и заканчивая хостом 120, скрипт должен быть вызван со следующими параметрами.
./testip.sh 10.205.236.0 1 120

Если вы столкнулись с ошибкой в работе скрипта или имеете предложение по его улучшению, напишите мне.