|
Программирование и разработка Обсуждение вопросов программирования |
|
Опции темы | Опции просмотра |
|
22.05.2011, 15:34 | #1 |
Кот - обормот
|
Скрипт на баше
Нужно написать скрипт на bash/ksh. Нужно вывести все системы, имеющие IP адрес в подсетях исходной системы и отвечающие на ARP запросы, потом вывести информацию об использовании дискового пространства локальных файловых систем.
Т.к. я хреново это все знаю, то намутил кучу и уже запутался. Просьба не обращать внимания на кучу лишних переменных, знаю, что убрать можно много. Код:
#! /usr/bin/ksh #подсчет количества подсетей netcount=`ifconfig -a | sed -n $q"p" | awk '{if($5=="broadcast") print $2}' | wc -l` i=1 while [ $i -le $netcount ] do #выборка маски ifconfig -a | awk '{if($5=="broadcast") print $4}' | tr '[a-f]' '[A-F]' | read a echo "ibase=16;$a"|bc | read mask #выборка адреса подсети ifconfig -a | awk '{if($5=="broadcast") print $2}' | read NET net=`echo $NET` n1=`echo $net | awk -F"." '{print $1}'` n2=`echo $net | awk -F"." '{print $2}'` n3=`echo $net | awk -F"." '{print $3}'` n4=`echo $net | awk -F"." '{print $4}'` net=`expr $n1 \* 16777216 + $n2 \* 65536 + $n3 \* 256 + $n4` #расчет последнего адреса в сети, то же самое, что 2^32-1 max=`expr 255 \* 16777216 + 255 \* 65536 + 255 \* 256 + 255` #расчет количества хостов host=`expr $max - $mask` #подсчет первого адреса в подсети: адрес бродкаста минус количество хостов ifconfig -a | sed -n $q"p" | awk '{if($5=="broadcast") print $6}' | read startip n1=`echo $startip | awk -F"." '{print $1}'` n2=`echo $startip | awk -F"." '{print $2}'` n3=`echo $startip | awk -F"." '{print $3}'` n4=`echo $startip | awk -F"." '{print $4}'` startip=`expr $n1 \* 16777216 + $n2 \* 65536 + $n3 \* 256 + $n4` start=`expr $startip - $host` end=`expr $net + $host - 1` j=$start while [ $j -le $end ] do a1=`expr $j / 16777216` r=`expr $j % 16777216` a2=`expr $r / 65536` r=`expr $r % 65536` a3=`expr $r / 256` a4=`expr $r % 256` #обновление ARP таблицы echo "ping $a1.$a2.$a3.$a4 ..." arp $a1.$a2.$a3.$a4 >>log if [ $? -eq 0 ] then echo "Disk space of local filesystems on $a1.$a2.$a3.$a4:" rsh $j df -l fi j=`expr $j + 1` done i=`expr $i + 1` done 100 пудов это все пишется, конечно, гораздо короче и менее запутано. Если кто подскажет - буду очень признательный.
__________________
Use the downforce, Luke! |
22.05.2011, 15:42 | #2 |
Местный
|
у тебя в первой же строчке ошибка, если в системе два адреса из одной сети - он тебе выдаст не одну сеть, а две. если пять - то пять.
с остальным не разбирался, запутано у тебя все. |
22.05.2011, 15:50 | #3 |
Кот - обормот
|
Запутано - не то слово...
Скрипт знакомый писал, потом я его еще мучал. В первой строчке ключ -l не дописал к wc. Вообще, выводит правильно - на три подсети три записи.
__________________
Use the downforce, Luke! |
22.05.2011, 15:52 | #4 |
Местный
|
а на три сети, но пять адресов?
|
22.05.2011, 16:00 | #5 |
Кот - обормот
|
Я так понимаю, вот эта строчка имеется в виду:
ifconfig -a | awk '{if($5=="broadcast") print $2}' | wc -l Так после awk же остаются только бродкаст-адреса, т.е. их в любом случае столько же, сколько подсетей. Три я написал потому, что там, где скрипт исполняется их три, а адресов то там прилично.
__________________
Use the downforce, Luke! |
22.05.2011, 16:04 | #6 |
Местный
|
$ ifconfig -a | awk '{if($5=="broadcast") print $2}'
192.168.10.250 192.168.11.250 192.168.10.111 192.168.11.111 85.114.xxx.xxx вывело пять, хотя сетей всего три. при этом есть еще два tun интерфейса от openvpn, в которых отсутствует broadcast и соответственно скрипт о них ничего не узнает |