Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

comment on

( #3333=superdoc: print w/replies, xml ) Need Help??
#!/usr/bin/perl -w # # pod at tail use strict; use Net::Ping; my $subnet = shift; # a.b.c.d/nn subnet/bitwise_netma +sk my %file = ( nmapout => 'panout', nmapclean => 'pamclean', pingout => 'papout', arpout => 'paaout', arpclean => 'paaclean', ); my %bin = ( nmap => '/usr/bin/nmap', # Debian 2.2r3 "Espy" arp => '/usr/sbin/arp', # Debian 2.2r3 "Espy" ); my @nmapregex = ( # text to remove from nmap output '^.*Log of.*$', # header line '^.*\.0\).*$', # subnet lines '^.*\.255\).*$', # broadcast lines '^Host\s+.*\(', # text prior to IP address '\) appears to be up\.', # text following IP address '^\s+', # whitespace-only lines ); my @arpregex = ( # text to remove from copied ARP +table '^.*\(incomplete\).*$', # incomplete MAC address '^Address\s+.*$', # header line '\sether\s', # HW type '\s+C\s+eth0', # Flags, Mask, Iface '^\s+', # whitespace-only lines ); # Make sure that *something* was entered by user for subnet/netmask unless ($subnet) { print "\nUsage: pingarp a.b.c.d/nn<enter>\n", "where a.b.c.d is your local subnet ", "and nn is your bitwise netmask netmask.\n\n"; exit; } $bin{nmapsyntax} = "-sP $subnet -o $file{nmapout}", # nmap v2.2 # Then check for valid subnet/mask from user to nmap # ? how to prevent leading zeroes ? (nmap bombs on 'em) # \. = octet boundry # \/ = subnet-netmask separator # 1st octet - match 1-254 # [1-9]|(?:[1-9]|1\d|2[0-4])\d|25[0-4] # 2nd, 3rd, 4th octets - match 0-254 # \d|(?:[1-9]|1\d|2[0-4])\d|25[0-4] # bitwise netmasks - 8..14, 16..22, 24..30 # [89]|1[012346789]|2[012456789]|30 print "\nChecking requirements.\n"; # if you got this far, Net::Ping must be installed, # otherwise would have halted with compilation errors. unless (-x $bin{nmap}) { print "nmap not accessible where script expects.\n\n"; exit; } unless (-x $bin{arp}) { print "arp not accessible where script expects.\n\n"; exit; } # Oddly enough, using nmap like this doesn't # seem to properly populate system ARP table. # System call uses "and" instead of "or" for some reason. print "Building list of live hosts on local subnet.\n"; system ("$bin{nmap} $bin{nmapsyntax} > /dev/null") and (die "Error cal +ling $bin{nmap}: $!"); open (NMAPOUT, "<$file{nmapout}") or die "Error opening $file{nmapout} RO: $!"; open (NMAPCLEAN, ">$file{nmapclean}") or die "Error opening $file{nmapclean} WO: $!"; while (<NMAPOUT>) { foreach my $regex(@nmapregex) {s/$regex//g;} print NMAPCLEAN $_; } close (NMAPOUT) or die "Error closing $file{nmapout}: $!"; close (NMAPCLEAN) or die "Error closing $file{nmapclean}: $!"; # So we have to do this with real pings. print "Populating local ARP table.\n"; open (NMAPCLEAN, "<$file{nmapclean}") or die "Error opening $file{nmapclean} RO: $!"; open (PINGOUT, ">$file{pingout}") or die "Error opening $file{pingout} WO: $!"; my @hosts = (<NMAPCLEAN>); my $p = Net::Ping->new("icmp"); foreach my $host (@hosts) { print PINGOUT "$host is "; print PINGOUT 'NOT ' unless $p->ping($host, 2); print PINGOUT "reachable.\n"; sleep (1); } $p->close(); # don't actually do anything with $file{pingout}, save it anyway. close (NMAPCLEAN) or die "Error closing $file{nmapclean}: $!"; close (PINGOUT) or die "Error closing $file{pingout}: $!"; print "Querying ARP table and cleaning results.\n"; system("$bin{arp} > $file{arpout}") and die "Error running $bin{arp}: $!"; open (ARPOUT, "<$file{arpout}") or die "Error opening $file{arpout} RO: $!"; open (ARPCLEAN, ">$file{arpclean}") or die "Error opening $file{arpclean} WO: $!"; while (<ARPOUT>) { foreach my $regex(@arpregex) {s/$regex//g;} tr/A-Z/a-z/; print ARPCLEAN $_; } close (ARPOUT) or die "Error closing $file{arpout}: $!"; close (ARPCLEAN) or die "Error closing $file{arpclean}: $!"; print( "\nOutput files:\n", " finished results: $file{arpclean}\n", " raw arp table: $file{arpout}\n", " ping-responding hosts: $file{pingout}\n", " nmap-responding hosts: $file{nmapclean}\n", " raw nmap results: $file{nmapout}\n\n" ); =head1 Name =head1 Summary Generate list of MAC addrs for all live IP devices on your subnet. =head1 Usage a.b.c.d/nn a.b.c.d = your local subnet address nn = bitwise netmask eg; Must run as root from host on same subnet as target hosts. Output files are placed in current directory. =head1 Requires and related nmap v2.12 Net::Ping included in standard Perl distribution arping =head1 Tested with Perl 5.00503 on Debian 2.2 "Espy" =head1 Updated 2001-04-30 14:00 Hashamafy passel o' scalars. Format for 75 chars/line max. 2001-03-30 Eliminate multiple useless "my var" at start of script by calling with "my" when first used. Clean up inconsistent indenting. Replace doublequotes with singlequotes for strings. 2000-09-22 Initial working code. =head1 ToDos Replace "Querying ARP table..." section with "snmpwalk <router> <community> IpnetToMediaPhysAddr" to allow script to work for remote segments. Will then need to prompt for (name|address) of remote router. Check for valid subnet/mask input. commented regex above or (Net::IPv4Addr|NetAddr::IP|NetAddr::IP::Count|Network::IPv4Addr) Check that script is being run by root (required for ICMP ping). Check into File::Temp for mess o' working files. Translate MACs for Token-Ring. =head1 Author ybiC =cut

In reply to (code) MAC n' IP cheese by ybiC

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?

What's my password?
Create A New User
Domain Nodelet?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (3)
As of 2023-01-27 21:35 GMT
Find Nodes?
    Voting Booth?

    No recent polls found