Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

pinger - ping a range of hosts

by grinder (Bishop)
on Mar 23, 2001 at 19:19 UTC ( #66636=sourcecode: print w/ replies, xml ) Need Help??

Category: Utility Scripts
Author/Contact Info grinder on perlmonks
Description: A little script that provides an easy way of pinging all the hosts from, e.g. 192.168.0.1 to 192.168.0.100. The output can be tailored in various ways.
#! /usr/bin/perl -Tw

use strict;
use vars qw/ $opt_b $opt_n $opt_q $opt_r $opt_s $opt_t /;
use constant TIMEOUT => 1;

use Getopt::Std;
use Socket;
use Net::Ping;

getopts( 'bnrqst:' );

$opt_r   = 1 if $opt_n or $opt_s;
$opt_q   = 1 if $opt_b;
$opt_t ||= TIMEOUT;

die "This script must be installed setuid root.\n" unless $> == 0;

my $first_taint = shift or die "No first IP address given (e.g. 172.17
+.1.1)\n";
my $last_taint  = shift or die "No last IP address given (e.g. 127)\n"
+;

my ($net,$first) = ($first_taint   =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3})\.(
+\d{1,3})$/ );
die "Couldn't determine the network part in $first_taint.\n" unless $n
+et;
die "Couldn't determine the host part in $first_taint.\n" unless $firs
+t;

my ($last) = ($last_taint =~ /^(\d{1,3})$/ );
die "Couldn't determine the host part in $last_taint.\n" unless $last;

($last, $first) = ($first, $last) if $last < $first;

my $p = Net::Ping->new( 'icmp' );
foreach my $host ( $first..$last )
{
    my $ip = "$net.$host";
    my $hostname = do {
        if( $opt_r and my $resolve = gethostbyaddr( inet_aton($ip), AF
+_INET )) {
            $resolve =~ s/\..*$// if $opt_s;
            $resolve .= " ($ip)" if $opt_n;
            $resolve;
        }
        else {
            $ip;
        }
    };

    if( $p->ping($ip, $opt_t) ) {
        print $hostname;
        print ' is reachable.' unless $opt_b;
        print "\n";
    }
    elsif( ! $opt_q ) {
        print "$hostname is NOT reachable.\n";
    }
}
$p->close();

=head1 NAME

pinger - ping a range of hosts

=head1 SYNOPSIS

B<pinger> [B<-bnqrs>] [B<-t> timeout] host last

=head1 DESCRIPTION

Ping a range of hosts using ICMP.

=head1 OPTIONS

=over 5

=item B<-b>

Brief. Do not print the "is reachable/is NOT reachable" text.
Probably needs B<-q> as well to be of any use to a program downstream.

=item B<-n>

Numeric. Print the numeric IP address as well as the resolved host nam
+e. (Sets B<-r>).

=item B<-q>

Quiet. Only report hosts that are pinged successfully.

=item B<-r>

Resolve. Resolve the numeric address to a FQDN host (implies -q unless
+ -n).

=item B<-s>

Short. Like B<-r>, but resolves the numeric address to a simple host n
+ame (stopping at the first dot).

=item B<-t timeout>

Timeout. Set the time out to t seconds (defaults to 1). A low timeout 
+value is used as this
script is destined to be used on internal networks where it is normal 
+to have sub-second
response times. The value may be easily edited in the source to a high
+er value if required.

=back

=head1 EXAMPLES

C<pinger 192.168.0.1 10>

Pings the machines from 192.168.0.1 to 192.168.0.10. Sample output loo
+ks like:

    192.168.0.1 is reachable.
    192.168.0.2 is NOT reachable.
    192.168.0.3 is reachable.
    192.168.0.4 is reachable.
    192.168.0.5 is NOT reachable.
    192.168.0.6 is reachable.
    192.168.0.7 is NOT reachable.
    192.168.0.8 is reachable.
    192.168.0.9 is reachable.
    192.168.0.10 is reachable.

C<pinger -r 192.168.0.1 6>

Pings the machines from 192.168.0.1 to 192.168.0.6 and resolves the ho
+stnames. In the following
example no A record for 192.168.0.3 exists, so the numeric IP address 
+is used instead.

    profane.example.com is reachable.
    slothrop.example.com is NOT reachable.
    192.168.0.3 is reachable.
    godolphin.example.com is reachable.
    stencil.example.com is NOT reachable.
    porpentine.example.com is reachable.

C<pinger -n 192.168.0.1 6>

Like the above, but also includes the numeric IP address alongside the
+ resolved host name.

    profane.example.com (192.168.0.1) is reachable.
    slothrop.example.com (192.168.0.2) is NOT reachable.
    192.168.0.3 is reachable.
    godolphin.example.com (192.168.0.4) is reachable.
    stencil.example.com (192.168.0.5) is NOT reachable.
    porpentine.example.com (192.168.0.6) is reachable.

C<pinger -sq 192.168.0.1 6>

This time, only display the local hostnames without the domain, and on
+ly report hosts that are pinged
successfully.

    profane is reachable.
    192.168.0.3 is reachable.
    godolphin is reachable.
    porpentine is reachable.

C<pinger -bq 192.168.0.1 6>

Report the IP addresses of all hosts that are pinged successfully.

    192.168.0.1
    192.168.0.3
    192.168.0.4
    192.168.0.6

=head1 BUGS

Due to the way Net::Ping works, and TCP/IP in general, this script
must be installed setuid root. In light of this constraint, the
script runs in tainted mode. To install the script, run the following
command:

C<chmod 4555 pinger>

The way the behaviour is controlled by the command-line switches is
unnecessarily obfuscated and should be cleaned up. This is a by-produc
+t
of the script's evolution. By and large, however, they tend to do
The Right Thing.

=head1 SEE ALSO

L<Net::Ping>

=head1 COPYRIGHT

Copyright 1999-2001 David Landgren.

This script is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=head1 AUTHOR

     David "grinder" Landgren
     eval {join chr(64) => qw[landgren bpinet.com]}

=cut

Comment on pinger - ping a range of hosts
Download Code
Re: pinger - ping a range of hosts
by spaz (Pilgrim) on Mar 23, 2001 at 23:09 UTC
    I only have 2 comments really :)
    • Your regexp for IP's is flawed, I can enter 999.999.999.999, which obviously isn't a real IP.
      I found something similar to this in the Ram book
      (?:(?:[01]?\d?\d|2[0-4]\d|25[0-5])\.?){4}
      Disclaimer: I realize this may not be the most efficent regex, but it does work, right?
    • If you're on a UNIX machine, you could always use nmap
    -- Dave
      The errata for Perl Cookbook at O'Reilly has a modified ip validation re. It is also in ping for ppt by me.

      m{ ^ ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] ) \. ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] ) \. ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] ) \. ( \d | [01]?\d\d | 2[0-4]\d | 25[0-5] ) $ # from the Perl Cookbook, Reci +pe 6.23, }xo # pages 218-9, as fixed in the + 01/00 reprint

      HTH
      --
      idnopheq
      Apply yourself to new problems without preparation, develop confidence in your ability to to meet situations as they arrise.

        ١.٢.٣.٤ is not a valid IP, it matches the regex though :)
Re: pinger - ping a range of hosts
by Anonymous Monk on Jun 02, 2010 at 15:23 UTC
    Very useful and exactly what I was looking for hoping to more more of the code

Back to Code Catacombs

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://66636]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (14)
As of 2015-07-06 13:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (74 votes), past polls