KAA76 писал(а):
Обязательно попробую - тем более давно в планах было освоить какти, но пока представляю ещё
пару вариантов массового сбора статистики.
Подойдёт тем, кто в качестве роутеров использует DES-3828.
Первый ОЧЕНЬ медленный и предназначен для тех, у кого аллергия на PHP. Всё на BASH:
Код:
#!/usr/local/bin/bash
# Перечисляем роутеры DES-3828
for router in 192.168.1.1 192.168.1.2 192.168.1.3
do
echo "$router"
# Собираем с 3828 связки IP-MAC
# sed-ом убираем не интересующие нас сегменты и маки.
`snmpwalk -v2c -c public $router IP-MIB::ipNetToMediaPhysAddress | awk '{print $1"."$4}' | awk -F. '{print $3"."$4"."$5"."$6
"."$7}' | sed -e "/192\.168/d" | sed -e "/ff:ff:ff:ff:ff:ff/d" | sed -e "s/:/./g" | awk -F. '{pri
ntf "%d.%d.%d.%d %02s:%02s:%02s:%02s:%02s:%02s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10}' > ./test1/ip_mac`
while read switch
do
echo "$switch"
# Собираем с 3525 связки MAC-Port
# sed-ом убираем не интересующие нас порты
`snmpwalk -v2c -c public $switch 1.3.6.1.2.1.17.7.1.2.2.1.2 | awk '{print $1"."$4}' | sed -e "/\.23$/d" | sed -e "/\.0$/
d" | awk -F. '{ printf "%02x:%02x:%02x:%02x:%02x:%02x %d\n",$10,$11,$12,$13,$14,$15,$16 }' > ./test1/mac_port`
# Ищем совпадающие MAC-адреса и выводим их с соответствующими IP и Port
while read line
do
mac=`echo "$line" | awk '{print $2}'`
ip=`echo "$line" | awk '{print $1}'`
while read line2
do
mac2=`echo "$line2" | awk '{print $1}'`
port=`echo "$line2" | awk '{print $2}'`
if [ "$mac2" == "$mac" ]
then
`mkdir ./switches/"$switch" &> /dev/null`
echo "$ip $mac $port" >> ./switches/"$switch"/"$DATE"
fi
done < ./test1/mac_port
done < ./test1/ip_mac
done < ./switch_net_$router
done
В файле ./switch_net_$router пока просто перечисление IP свичей (1 IP - 1 строчка), о которых знает 3828. Позже, поскольку у нас тут небольшой бардачёк с портами, будут ещё перечислены порты-исключения для каждого свича.
Второй на порядок быстрее. Кусок PHP написан не мной.
Код:
#!/usr/local/bin/bash
# Перечисляем роутеры DES-3828
for router in 192.168.1.1 192.168.1.2 192.168.1.3
do
echo "$router"
# Собираем с 3828 связки IP-MAC
# sed-ом убираем не интересующие нас сегменты и маки.
`snmpwalk -v2c -c public $router IP-MIB::ipNetToMediaPhysAddress | awk '{print $1"."$4}' | awk -F. '{print $3"."$4"."$5"."$6
"."$7}' | sed -e "/192\.168/d" | sed -e "/ff:ff:ff:ff:ff:ff/d" | sed -e "s/:/./g" | awk -F. '{pri
ntf "%d.%d.%d.%d %02s:%02s:%02s:%02s:%02s:%02s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10}' > ./test1/ip_mac`
while read switch
do
echo "$switch"
# Собираем с 3525 связки MAC-Port
# sed-ом убираем не интересующие нас порты
`snmpwalk -v2c -c public $switch 1.3.6.1.2.1.17.7.1.2.2.1.2 | awk '{print $1"."$4}' | sed -e "/\.23$/d" | sed -e "/\.0$/
d" | awk -F. '{ printf "%02x:%02x:%02x:%02x:%02x:%02x %d\n",$10,$11,$12,$13,$14,$15,$16 }' > ./test1/mac_port`
php -n -f ./parser ./test1/ip_mac ./test1/mac_port $switch
done < ./switch_net_$router
done
а вот, и parser:
Код:
#!/usr/local/bin/php
<?
if($_SERVER['argc']!=4)
{
echo "\nUsage: scrpt_name ip_mac mac_port switch_ip";
exit;
}
$ip_mac = $_SERVER['argv'][1];
$mac_port = $_SERVER['argv'][2];
$switch_ip = $_SERVER['argv'][3];
if(!file_exists($ip_mac))
{
echo "\nError: $ip_mac not exists";
exit;
}
if(!file_exists($mac_port))
{
echo "\nError: $mac_port not exists";
exit;
}
$rez = array();
$f = fopen($ip_mac,"r") or die("\nERROR: Cant open $ip_mac");
while(!feof($f))
{
$str = trim(fgets($f));
$strar = split(" ",$str);
$ip= $strar[0];
$mac= $strar[1];
if(isset($ip) && isset($mac)) $rez[$mac]['IP']=$ip;
}
fclose($f);
$f = fopen($mac_port,"r") or die("\nERROR: Cant open $mac_port");
while(!feof($f))
{
$str = trim(fgets($f));
$strar = split(" ",$str);
$mac= $strar[0];
$port= $strar[1];
if(isset($mac) && isset($port)) $rez[$mac]['port']=$port;
}
fclose($f);
$dir = "/root/switches/".$switch_ip."/";
$filename = date("d.m H:i");
if(!file_exists($dir))
mkdir($dir);
$out = fopen($dir.$filename,"w") or die("\nERROR: cant open ".$dir.$filename);
foreach ($rez as $mac=>$value)
{
if(isset($value['IP']) && isset($value['port']))
{
$str = $value['IP']." ".$mac." ".$value['port'];
fputs($out,$str."\n");
}
}
fclose($out);
?>