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);
?>