#! /bin/perl # Läuft nur unter Windows richtig # HP9304 #.1 .3 .6 .1 .2 .1 .4 .22 .1 .1 #iso org dod internet mgmt mib-2 ip ipnettomediatable ipnettomediaentry ipnettomediaifindex # .2 use Win32::Console::ANSI; use Term::ANSIScreen qw/:color :cursor :screen/; use Net::Nslookup; use strict; while (1) { my @switches=(); my @routers=(); my @cutoffs=(); ##### Gesuchte IP entgegennehmen print "\e[2JGesuchte IP eingeben, beendet: "; my $ip=; chomp $ip; if ($ip eq "") { exit; } ##### Gesuchte IP anpingen um auf jeden Fall einen ARP Eintrag zu erhalten `ping -n 3 -w 1000 $ip`; ##### Falls IP keine IP sondern ein Hostname ist wird IP ermittelt unless ($ip =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { my $a = nslookup(host => "$ip"); print "Interpretiere $ip als hostname\n"; if ($a eq "") { print "Host $ip nicht gefunden. für weiter!\n"; ; next; } print "$ip zu $a aufgelöst\n\n"; $ip = $a; } ##### Konfig der Switches lesen open SWITCHES, ") { chomp; next unless ($_ =~ /^[0-9]/); @switches=(@switches, $_); } close SWITCHES; ##### Konfig der Router lesen open ROUTERS, ") { chomp; next unless ($_ =~ /^[0-9]/); @routers=(@routers, $_); } close ROUTERS; ##### Auszublendende Switch/Port einlesen open CUTOFF, ") { chomp; next unless ($_ =~ /^[0-9]/); @cutoffs=(@cutoffs, $_); } close CUTOFF; ##### Router durchsuchen um MAC zu IP zu finden my @array; ##### Router einzeln durchlaufen foreach my $router (@routers) { my @onerouter; ##### ARP Einträge eines Routers lesen @onerouter = `snmpwalk -mall -c public $router .1.3.6.1.2.1.4.22.1.2`; ##### Alle ARP Einträge zusammenfassen @array = (@array, @onerouter); } my $ergebnis=""; my $intind=""; my $intname=""; my $mac=""; my $gesmac=""; my ($m1,$m2,$m3,$m4,$m5,$m6); $m1=$m2=$m3=$m4=$m5=$m6=0; ##### Alle ARP Einträge durchlaufen foreach my $arrayline (@array) { chomp $arrayline; my ($tmp,$mac) = split /: /,$arrayline; #print "$arrayline\n"; if ( $arrayline =~ /$ip /) { $gesmac = $mac; # print $arrayline; ##### ... und gesuchte MAC Adr. herausfiltern print "Gesuchte MAC-Adresse: $gesmac\n"; ($m1,$m2,$m3,$m4,$m5,$m6) = split / /,$gesmac; $m1 = hex($m1); $m2 = hex($m2); $m3 = hex($m3); $m4 = hex($m4); $m5 = hex($m5); $m6 = hex($m6); last; } } ##### MAC my $oid=".1.3.6.1.2.1.17.4.3.1.1.$m1.$m2.$m3.$m4.$m5.$m6"; #print $oid; # HP 4000 #.1.3.6.1.2.1.2.iftable(2).ifentry(1).ifphysaddr(6) # .ifdescr(2) #.1.3.6.1.2.1.17.4.3.1.1 MAC-Adressen #.1.3.6.1.2.1.17.4.3.1.2 InterfaceIndex #.1.3.6.1.2.1.2.2.1.2.InterfaceIndex => InterfaceName # print "\n"; foreach my $switch (@switches) { #print "\n"; savepos(); print "Durchsuche Switch $switch"; my $ergebnis = `snmpwalk -mall -c public "$switch" "$oid"`; # Suche MAC auf akt Switch #print "$ergebnis\n"; my $tmp; my $mac2=""; ($tmp,$mac2) = split /: /,$ergebnis; chomp $mac2; #print "$gesmac|$mac2|\n"; if ($gesmac eq $mac2) { my $oid2=".1.3.6.1.2.1.17.4.3.1.2.$m1.$m2.$m3.$m4.$m5.$m6"; # Ermittle InterfaceIndex my $intind=`snmpwalk -mall -c public "$switch" "$oid2"`; my ($tmp,$intindex) = split /=/,$intind; chomp $intindex; $intindex =~ s/ //,$intindex; #print "\n"; loadpos; #print "MAC-Adresse auf Switch $switch gefunden\n"; my $oid3=".1.3.6.1.2.1.2.2.1.2.$intindex"; #print "$oid3"; #print "snmpwalk -mall -c public $switch $oid3\n"; my $intname=`snmpwalk -mall -c public "$switch" "$oid3"`; #print "$intname\n"; my ($tmp,$intnam) = split /=/,$intname; $intnam =~ s/"//,$intnam; $intnam =~ s/ //,$intnam; $intnam =~ s/"//,$intnam; chomp $intnam; #print "INTNAME:$intnam;"; unless ($intnam =~ /Mesh/ or $intnam =~ /net/ or length($intnam)==0) { my $cutoffmarker=0; foreach my $cutoff (@cutoffs) { if ($cutoff eq "$switch,$intnam") { $cutoffmarker=1; } } unless ($cutoffmarker == 1) { print "MAC-Adresse auf Switch $switch gefunden\n"; print "Port gefunden: $intnam\n\n" ; savepos; } } } loadpos(); #print "\e[1A"; clline(); } print " für weiter!"; ; }