Скрипт диагностики сети

Можно пингануть хост .255 :-) Но это не сработает при некоторых настройках локального свича или хостов.
Так что извращаемся:

for i in `seq 20 35`; do if ping -c1 -t1 192.168.5.$i > /dev/null
then arp 192.168.5.$i | awk '{print $2, $4}'; fi; done

Этот скрипт проверяет, пингуется ли хост, и, если “да”, то запрашивает его мак-адрес. Из ответа выдает нам в столбик айпишник и мак

Если хост не в локалке, то мы не можем получить его мак, соответственно, первый скрипт нам ничего не даст. Так что воспользуемся упрощенной версией:

for i in `seq 20 35`; do ping -c1 -t1 192.168.5.$i | grep "bytes from"; done

Здесь мы видим список первых пингов к ответившим хостам.

Также бывают нужны варианты опросить всю локалку, кто вообще есть включенный, в том числе за фаерволом.
Следующий вариант показывает всех в локальном сегменте, включая спрятавшихся за персональным фаерволом:

for i in `seq 20 35`; do ping -c1 -t1 192.168.5.$i > /dev/null; 
arp 192.168.5.$i | grep -v incomplete | awk '{print $2, $4}' ; done

Этот скрипт пытается пингануть, и, вне зависимости от ответа на пинг, запрашивает мак. Ответ фильтруется, а затем выдается в два столбца - айпишник и мак.
Однако, вполне реальна ситуация, что у нашей машины существует некая статическая запись в arp-таблице, сделанная, например, так:

arp -s 192.168.5.22 02:48:33:00:09:0b

Тогда ответ может быть некорректным: мак есть, а хост отключен.
Также (насколько я помню), когда в свитче прописано соответсвие MAC и IP адресов, то он по дефолту отдает эти сведения вне зависимости, включен хост с соответствующим MAC-ом, или нет.

Или можно сделать arping 00:00:00:00:00:00

В остальных случаях юзаем nmap

Далее - мои ранние попытки слепить “программу”

Типа программа

netping.sh
#!/bin/sh
if [ -z $1 ]
	then
		echo "##################################"
		echo "Usage:"
		echo "netping start_octet last_octet network," or
		echo "netping ip.net.wo.rk/mask"
		echo "where start - first IP to ping, last - last IP address to ping,"
		echo "network - ip network prefix." # If not set, your default net will be used"
		echo "first 15 IP of network given will be pinged"
		netstart=1
	elif [ $#=1 ] && echo $1 | grep '[0-9]/[1-3][0-9]' > /dev/null
                then
		net_pref=$(echo $(echo $1 | awk -F . '{ print $1 "." $2 "." $3 "." }'))
		netstart=1
                netend=254
        else
		netstart=$1
fi
if [ -z $2 ]
	then
		netend=$(($netstart+15))
	else
		netend=$2
fi
if [ $netstart -le 255 ]
	then
		startip=$netstart
	else
		startip=1
fi
if [ $netend -le 255 ]
	then
		endip=$netend
	else
		endip=255
fi
if [ -z $3 ]
	then
		echo "Network does not set. Your default net will be used"
                echo " "
                echo "##################################"
                echo " "
# Only one active network	net_pref=$(echo $(ifconfig | grep -B2 ": active" | grep inet) | awk '{ print $2 }' | awk -F . '{ print $1 "." $2 "." $3 "." }')		net_pref=$(echo $(netstat -rn -f inet | grep default) | awk '{ print $2 }' | awk -F . '{ print $1 "." $2 "." $3 "." }')
# For default route network:
		net_pref=$(echo $(netstat -rn -f inet | grep default) | awk '{ print $2 }' | awk -F . '{ print $1 "." $2 "." $3 "." }')
	else
		net_pref=$(echo $(echo $3 | awk -F . '{ print $1 "." $2 "." $3 "." }'))
fi
i=$startip
while [ $i -le $endip ]
do
if ping -c1 -t1 $net_pref$i >> /dev/null
	then
		mac=$(arp $net_pref$i | awk '{ print $4 " via " $6 }')
		echo $net_pref$i $mac
fi
i=$(($i+1))
done
security_lab/netping.txt · Last modified: 2015/07/10 21:35 by rybario
About this template
CC Attribution-Share Alike 4.0 International
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5