|
Программирование и разработка Обсуждение вопросов программирования |
|
Опции темы | Опции просмотра |
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 и соответственно скрипт о них ничего не узнает |
22.05.2011, 16:08 | #7 |
Местный
|
в общем, эту строчку, изначально кривую, надо заменить вот этим - ifconfig -a | grep broadcast |sort -u +5 |wc -l
у меня на freebsd работает правильно. |
22.05.2011, 16:11 | #8 |
Кот - обормот
|
Благодарю Я хреново в этом разбираюсь
То есть бродкаст-адресов может быть больше, чем сетей? Я думал, что для каждой сети может быть только по одному бродкасту: адрес сети с маской.
__________________
Use the downforce, Luke! |
22.05.2011, 16:15 | #9 |
Местный
|
броадкаст выводится на каждый адрес, вне зависимости от того, есть ли еще адреса из этой сети в системе или нет.
а вообще завязываться на ifocnfig опасно, так как его вывод не стандартизирован и то, что у меня работает правильно на фре, может не сработать на линухе... правда как сделать по-другому пока не знаю Последний раз редактировалось VK. 22.05.2011 в 16:17. |
22.05.2011, 16:23 | #10 |
Кот - обормот
|
Мне надо, чтобы на Солярисе работало В общем-то, должно.
На ifconfig завязываться нужно - попросили именно так делать. А вообще, по идее, можно еще из hosts вытащить. Но сказано не делать. Хотя, если есть третий способ без hosts, думаю, должно прокатить.
__________________
Use the downforce, Luke! |