Форум Gatchina OnLine  

Вернуться   Форум Gatchina OnLine > Hard&Soft > Программирование и разработка

Программирование и разработка Обсуждение вопросов программирования

Ответ
 
Опции темы Опции просмотра
Старый 22.05.2011, 15:34   #1
TNT
Кот - обормот
 
Аватар для TNT
 
Регистрация: 24.01.2006
Адрес: Въездъ

Нарушения:[Посмотреть]
Скрипт на баше

Нужно написать скрипт на 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!
TNT вне форума   Ответить с цитированием
Старый 22.05.2011, 15:42   #2
VK
Местный
 
Аватар для VK
 
Регистрация: 21.09.2009

Нарушения:[Посмотреть]
у тебя в первой же строчке ошибка, если в системе два адреса из одной сети - он тебе выдаст не одну сеть, а две. если пять - то пять.
с остальным не разбирался, запутано у тебя все.
VK вне форума   Ответить с цитированием
Старый 22.05.2011, 15:50   #3
TNT
Кот - обормот
 
Аватар для TNT
 
Регистрация: 24.01.2006
Адрес: Въездъ

Нарушения:[Посмотреть]
Запутано - не то слово...
Скрипт знакомый писал, потом я его еще мучал.

В первой строчке ключ -l не дописал к wc. Вообще, выводит правильно - на три подсети три записи.
__________________
Use the downforce, Luke!
TNT вне форума   Ответить с цитированием
Старый 22.05.2011, 15:52   #4
VK
Местный
 
Аватар для VK
 
Регистрация: 21.09.2009

Нарушения:[Посмотреть]
а на три сети, но пять адресов?
VK вне форума   Ответить с цитированием
Старый 22.05.2011, 16:00   #5
TNT
Кот - обормот
 
Аватар для TNT
 
Регистрация: 24.01.2006
Адрес: Въездъ

Нарушения:[Посмотреть]
Я так понимаю, вот эта строчка имеется в виду:

ifconfig -a | awk '{if($5=="broadcast") print $2}' | wc -l

Так после awk же остаются только бродкаст-адреса, т.е. их в любом случае столько же, сколько подсетей.
Три я написал потому, что там, где скрипт исполняется их три, а адресов то там прилично.
__________________
Use the downforce, Luke!
TNT вне форума   Ответить с цитированием
Старый 22.05.2011, 16:04   #6
VK
Местный
 
Аватар для VK
 
Регистрация: 21.09.2009

Нарушения:[Посмотреть]
$ 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 и соответственно скрипт о них ничего не узнает
VK вне форума   Ответить с цитированием
Старый 22.05.2011, 16:08   #7
VK
Местный
 
Аватар для VK
 
Регистрация: 21.09.2009

Нарушения:[Посмотреть]
в общем, эту строчку, изначально кривую, надо заменить вот этим - ifconfig -a | grep broadcast |sort -u +5 |wc -l
у меня на freebsd работает правильно.
VK вне форума   Ответить с цитированием
Старый 22.05.2011, 16:11   #8
TNT
Кот - обормот
 
Аватар для TNT
 
Регистрация: 24.01.2006
Адрес: Въездъ

Нарушения:[Посмотреть]
Благодарю Я хреново в этом разбираюсь
То есть бродкаст-адресов может быть больше, чем сетей? Я думал, что для каждой сети может быть только по одному бродкасту: адрес сети с маской.
__________________
Use the downforce, Luke!
TNT вне форума   Ответить с цитированием
Старый 22.05.2011, 16:15   #9
VK
Местный
 
Аватар для VK
 
Регистрация: 21.09.2009

Нарушения:[Посмотреть]
броадкаст выводится на каждый адрес, вне зависимости от того, есть ли еще адреса из этой сети в системе или нет.
а вообще завязываться на ifocnfig опасно, так как его вывод не стандартизирован и то, что у меня работает правильно на фре, может не сработать на линухе... правда как сделать по-другому пока не знаю

Последний раз редактировалось VK. 22.05.2011 в 16:17.
VK вне форума   Ответить с цитированием
Старый 22.05.2011, 16:23   #10
TNT
Кот - обормот
 
Аватар для TNT
 
Регистрация: 24.01.2006
Адрес: Въездъ

Нарушения:[Посмотреть]
Мне надо, чтобы на Солярисе работало В общем-то, должно.

На ifconfig завязываться нужно - попросили именно так делать. А вообще, по идее, можно еще из hosts вытащить. Но сказано не делать. Хотя, если есть третий способ без hosts, думаю, должно прокатить.
__________________
Use the downforce, Luke!
TNT вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 09:22. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot