Скрипт для поиска занятых IP-адресов в сети на Shell

 

 BashShellсниппет

Передо мной встала задача - проверить занятые 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

Скрипт принимает три необязательные параметра:

  1. адрес сети - обязательно указать первые три октета в десятичном виде, разделённые точками. По умолчанию принимает значение, вычисленное по IP-адресу первого сетевого подключения;
  2. начальный номер хоста - идентификатор хоста, с которого начинается проверка. Принимает значение в десятичном виде от 1 до 254, значение по умолчанию 1;
  3. конечный номер хоста - идентификатор хоста, на котором заканчивается проверка. Принимает значение в десятичном виде от 1 до 254, значение по умолчанию 254.

Важно! Скрипт считает размер сетевого префикса равным 24 битам, это значит, что при проверке всего диапазона IP-адресов будут проверены 254 хоста. Номера хостов 0 и 255 не проверяются, так как:

Это необходимо учитывать при проверке занятых IP-адресов в подсетях, задавая самостоятельно диапазон для начального и конечного хостов.

./testip.sh

В результате выполнение скрипта будут просканированы хосты с 1 по 244 в сети, к которой подключён первый сетевой интерфейс машины, с которой запускается его выполнение.

Если вам требуется проверить занятые IP-адреса в сети 10.205.236.0/24 начиная с хоста 1 и заканчивая хостом 120, скрипт должен быть вызван со следующими параметрами.

./testip.sh 10.205.236.0 1 120 

Результат выполнения скрипта testip.sh в окне GNOME Terminal

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