#!/usr/bin/perl use strict; use File::Copy; use Net::Telnet; my $storepath = './'; my $source_list = $storepath.'ip-mac.txt'; my $macaddr; my $result; my $oid_mac; my $oid_port; my $i_count=0; my $dumplog = './dump_port.log'; sub trim($) { $_[0]=~s/(^\s+)|(\s+$)|(\n$)//gs; return $_[0]; }; open (RW," >>$dumplog") or die "can't open dumplog: $!"; open (RL, $source_list) or die "can't open source list: $!"; while(){ my $ip= (split(/[;]/), $_)[0]; trim($ip); my $mac=(split(/[;]/), $_)[1]; trim($mac); my $ip_to= (split(/[;]/), $_)[2]; trim($ip_to); my $flag=(split(/[;]/), $_)[3]; trim($flag); print "-----------------------------------------\n"; print "start $ip-$ip_to-$mac\n"; my $username = 'LOGIN'; my $password = 'PASS'; my $dumplog_telnet = 'dump_telnet.log'; if ($ip =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) { #Zyxel if($flag == 0){ print "telnet...start\n"; my $command_ping= 'ping '.$ip_to; my $command_ex='exit'; my $telnet = new Net::Telnet ( Timeout=>20, Errmode=> 'return', Dump_Log => $dumplog_telnet); if($telnet->open($ip)){ if($telnet->print($username)){ sleep(1); if($telnet->print($password)){ if($telnet->print($command_ping)){ sleep(1); if($telnet->print($command_ex)){ sleep(1); } }else{ print "error ping"; } }else{ print "error pass"; } }else{ print "error username"; } if($telnet->close){ print "telnet...end\n"; } }else{ print "error open"; } sleep(3); open DATA,"/usr/local/bin/snmpwalk -Osfn -c COMMUNITY -v 2c $ip .1.3.6.1.2.1.17.4.3.1.2|"; $oid_mac=""; $macaddr=""; $oid_port=""; while (){ $oid_mac=(split(/[=]/), $_)[0]; trim($oid_mac); $oid_port=(split(/[ ]/), $_)[3]; trim($oid_port); if ($oid_mac =~ /^\.1\.3\.6\.1\.2\.1\.17\.4\.3\.1\.2\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) { my $mac1=sprintf "%02lx",$1; my $mac2=sprintf "%02lx",$2; my $mac3=sprintf "%02lx",$3; my $mac4=sprintf "%02lx",$4; my $mac5=sprintf "%02lx",$5; my $mac6=sprintf "%02lx",$6; $macaddr=$mac1.' '.$mac2.' '.$mac3.' '.$mac4.' '.$mac5.' '.$mac6; trim($macaddr); } if ($macaddr =~ /$mac/) { $i_count=$i_count + 1; print "$i_count: $ip - $oid_port - $mac - $ip_to - $flag\n"; print RW "$ip;$oid_port;$mac;$ip_to;$flag\n"; } } }elsif($flag == 1){ #D-link print "telnet...start\n"; my $command_ping= 'ping '.$ip_to.' times 1'; my $command_ex='logo'; my $telnet = new Net::Telnet ( Timeout=>20, Errmode=> 'return', Dump_Log => $dumplog_telnet); if($telnet->open($ip)){ if($telnet->print($username)){ sleep(1); if($telnet->print($password)){ if($telnet->print($command_ping)){ sleep(1); if($telnet->print($command_ex)){ sleep(1); } }else{ print "error ping"; } }else{ print "error pass"; } }else{ print "error username"; } if($telnet->close){ print "telnet...end\n"; } }else{ print "error open"; } sleep(3); open DATA,"/usr/local/bin/snmpwalk -Osfn -c COMMUNITY -v 2c $ip .1.3.6.1.2.1.17.7.1.2.2.1.2|"; $oid_mac=""; $macaddr=""; $oid_port=""; while (){ $oid_mac=(split(/[=]/), $_)[0]; trim($oid_mac); $oid_port=(split(/[ ]/), $_)[3]; trim($oid_port); if ($oid_mac =~ /^\.1\.3\.6\.1\.2\.1\.17\.7\.1\.2\.2\.1\.2\.\d{1,3}\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) { my $mac1=sprintf "%02lx",$1; my $mac2=sprintf "%02lx",$2; my $mac3=sprintf "%02lx",$3; my $mac4=sprintf "%02lx",$4; my $mac5=sprintf "%02lx",$5; my $mac6=sprintf "%02lx",$6; $macaddr=$mac1.' '.$mac2.' '.$mac3.' '.$mac4.' '.$mac5.' '.$mac6; trim($macaddr); if ($macaddr =~ /$mac/) { $flag=1; $i_count=$i_count + 1; print "$i_count: $ip - $oid_port - $mac - $ip_to - $flag\n"; print RW "$ip;$oid_port;$mac;$ip_to;$flag\n"; } } } } } } close(RW); close(RL);