DES3526

Материал из OpenWiki
Перейти к: навигация, поиск

Скрипт на Perl для сбора данных MAC-адресов и номеров портов со свитчей D-Link и привязки их к ip адресам

#!/usr/bin/perl


@SNMP_TARGET = qw(ip1 ip2 ipN);  #List of switch (ip address)
$SNMP_GET_CMD = "snmpwalk -v2c -c public -m +SNMPv2-SMI";

#Собираем списки ip - mac на сервере, например с помощью arp, или считывать уже собранные с помощью arpwatch

my %ips = ();
chomp($ips = `arp -an`);
@ips = split(/\n/, $ips);
#Строим хеш ip - mac

foreach my $keys(@ips)
{
        my @a=( $keys=~ m/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/g);
        my @b=( $keys=~ m/[0-9a-f]{2}\:[0-9a-f]{2}\:[0-9a-f]{2}\:[0-9a-f]{2}\:[0-9a-f]{2}\:[0-9a-f]{2}/ig);
        $ips{"$b[0]"} .= "$a[0]" if (($b[0] && $a[0]) ne undef );
}

#Обрабатываем каждый эелемент списка свитчей если их несколько

foreach my $i(@SNMP_TARGET)
{
        my ($mac, $ports);

#По снмп снимаем данные в виде:
#SNMPv2-SMI::mib-2.17.4.3.1.1.0.128.200.0.0.0 = Hex-STRING: 00 80 C8 00 00 00   --- mac address
#SNMPv2-SMI::mib-2.17.4.3.1.2.0.128.200.0.0.0 = INTEGER: 26                     --- ports

#Get macs from switch:
        chomp($mac = `${SNMP_GET_CMD} $i SNMPv2-SMI::mib-2.17.4.3.1.1`);
#Get ports from switch:
        chomp($ports = `${SNMP_GET_CMD} $i SNMPv2-SMI::mib-2.17.4.3.1.2`);
         my %hash_mac = ();
         my %hash_ports= ();
         @mac= split(/\n/, $mac);
         @ports= split(/\n/, $ports);
          foreach my $keys(@mac)
        {
                my @a = @b = ();
#Выделяем часть ветки снмп для ключа в хеше с mac:
                my @a=($keys =~ m/2\.17\.4\.3\.1\.1\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ig);
                 $a[0] =~ s/2\.17\.4\.3\.1\.1\.//ig;
#Выделяем мак адрес:
                my @b=($keys =~ m/[0-9a-z]{2}\s+[0-9a-z]{2}\s+[0-9a-z]{2}\s+[0-9a-z]{2}\s+[0-9a-z]{2}\s+[0-9a-z]{2}/ig);
                $b[0] =~ tr/A-Z/a-z/;
                $b[0] =~ tr/[ ]/\:/;
                $hash_mac{"$a[0]"} .= "$b[0]" if (($b[0] && $a[0]) ne undef );
        }
        foreach my $keys(@ports)
        {
                my @a = @b = ();
#Выделяем часть ветки снмп для ключа в хеше с номером порта:
                my @a=($keys =~ m/2\.17\.4\.3\.1\.2\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ig);
                 $a[0] =~ s/2\.17\.4\.3\.1\.2\.//ig;
#Выделяем номер порта
                my @b=($keys =~ m/\: [1-9]{1}[0-9]{0,1}/ig);
                 $b[0] =~ s/\:\s//ig;
#Нас не интерсуют магистральные порты 25 и 26 и пустые:
                $hash_ports{"$a[0]"} .= " $b[0]" if ($b[0] < 25) && ($b[0] ne undef );
        }
        foreach (keys(%hash_ports))
        {
                if (exists $hash_mac{$_})
                {
#Итого: $i - свитч, $hash_mac{$_} - mac address, $ips{$hash_mac{$_}} - ip, $hash_ports{$_} - port
                        print ("$i\t$hash_mac{$_}\t$ips{$hash_mac{$_}}\t$hash_ports{$_}\n");
                }
        }
}

Регепсы вещь исключительно творческая и индивидуальная, желательно проверять в каждом отдельном случае
Бывает не определяет IP адреса в связи с различием букв прописные<>заглавные