this script is supposed to take an input like 10.0.1.0/24
and output something like this
HOSTNAME MACADDRESS
node-1 00:30:48:28:E9:7E
node-2 00:30:48:29:12:1A

but it is only returning very few if any results.
anyone have any ideas, or maybe a better way to do this?


#!/usr/bin/perl
use strict;

use Getopt::Std;
use Net::DNS;
use IO::Select;
use Net::Netmask;

my $timeout = 5;
my $nameserver = "10.0.1.240";
my $subnet;
my %host;
my %opts;
getopts('n:', \%opts);

die "Usage: arp-scan_lookup.pl -n 10.0.0.0/24\n"
   unless $opts{n};

use Net::Pkt::DescL2;
Net::Pkt::DescL2->new;

use Net::Pkt::Quick;

$subnet = Net::Netmask->new2($opts{n});

my @frames;
for ($subnet->enumerate) {
   my $frame = Net::Pkt::Quick->arpRequest(
      whoHas  => "$_",
      tell    => $Net::Pkt::Ip,
      tellMac => $Net::Pkt::Mac,
      toMac   => 'broadcast',
   );
   push @frames, $frame;
}

use Net::Pkt::Dump;
my $dump = Net::Pkt::Dump->new(
   filter             => "arp",
   unlinkAfterAnalyze => 1,
);

$dump->start;

$frames[$_ - 1]->send for $subnet->enumerate;

$dump->stop;

$dump->analyze;
my @replies;
for ($subnet->enumerate) {
   my $reply = $frames[$_ - 1]->recv;
   next unless $reply;
   push @replies, $reply;
}

sub lookup {
    my $ip_address = shift;
    my $result;
    my $res = new Net::DNS::Resolver;
    $res->nameservers( $nameserver );
    my $bgsock = $res->bgsend( $ip_address );
    my $sel = new IO::Select($bgsock);
    my @ready = $sel->can_read($timeout);
    if (@ready) {
        foreach my $sock (@ready) {
            if ($sock == $bgsock) {
                my $packet = $res->bgread($bgsock);
                if ($packet) {
                    foreach my $rr ($packet->answer) {
                        my $hostname = $rr->rdatastr;
                        $hostname =~ s/\.pz.local.//g;
                        $result = $hostname;
                    }
                }
                else { 
                    $result = $ip_address;
                }
                $bgsock = undef;
            }
            $sel->remove($sock);
            $sock = undef;
        }
    }
    else {
        $result = $ip_address;
    }
    if ( $result eq "" ) { $result = $ip_address; }
    return $result;
}

print lookup($_->arpSrcIp), "   ", $_->arpSrc, "\n" for @replies;

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to