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 адреса в связи с различием букв прописные<>заглавные