Files
scripts/Perl arp cache per snmp durchsuchen/arpsearch2.pl
2024-10-14 00:08:40 +02:00

157 lines
4.0 KiB
Perl
Raw Blame History

#! /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=();
##### Gesuchte IP entgegennehmen
print "\e[2JGesuchte IP eingeben, <ENTER> beendet: ";
my $ip=<STDIN>;
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. <Enter> f<>r weiter!\n";
<STDIN>;
next;
}
print "$ip zu $a aufgel<65>st\n\n";
$ip = $a;
}
##### Konfig der Switches lesen
open SWITCHES, "<switches.conf";
while (<SWITCHES>) {
chomp;
next unless ($_ =~ /^[0-9]/);
@switches=(@switches, $_);
}
close SWITCHES;
##### Konfig der Router lesen
open ROUTERS, "<routers.conf";
while (<ROUTERS>) {
chomp;
next unless ($_ =~ /^[0-9]/);
@routers=(@routers, $_);
}
close ROUTERS;
##### Router durchsuchen um MAC zu IP zu finden
my @array;
##### Router einzeln durchlaufen
foreach my $router (@routers) {
my @onerouter;
##### ARP Eintr<74>ge eines Routers lesen
@onerouter = `snmpwalk -mall -c public $router .1.3.6.1.2.1.4.22.1.2`;
##### Alle ARP Eintr<74>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<74>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);
}
}
##### 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) {
savepos();
print "Durchsuche Switch $switch";
my $ergebnis = `snmpwalk -mall -c public "$switch" "$oid"`; # Suche MAC auf akt Switch
my $tmp;
my $mac2="";
($tmp,$mac2) = split /: /,$ergebnis;
chomp $mac2;
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;
if ($intindex < 200) { # Portnummer ist kleiner 200 heist auf HP4, HP5 kein Trunk!
loadpos;
my $oid3=".1.3.6.1.2.1.2.2.1.2.$intindex";
my $intname=`snmpwalk -mall -c public "$switch" "$oid3"`;
my ($tmp,$intnam) = split /=/,$intname;
$intnam =~ s/"//,$intnam;
$intnam =~ s/ //,$intnam;
$intnam =~ s/"//,$intnam;
if($intname !~ /mesh/i and $intname !~ /net/i and $intname !~ /trk/i) {
# ports die mesh, trk und net im Namen enthalten d<>rften keine Downlink Ports sein
print "MAC-Adresse auf Switch $switch gefunden\n";
print "Port gefunden: $intnam\n";
}
savepos;
}
}
loadpos();
clline();
}
print "<Enter> f<>r weiter!";
<STDIN>;
}