On Tue, May 02, 2006 at 06:26:40PM +0200, Fabio wrote:
> ciao,
> ho risolto utilizzando la libreria Net::Ping ma rimane la curiositĂ  di capire 
> come mai con la chiamata del comando shell si aveva quel comportamento 
> strano, qualcuno può azzardare ipotesi?

no... pero' ti riciclo questo script (che era stato richiesto su altre
ML):

#! /usr/bin/perl -w

use strict;
use Net::Ping;
use threads;
use threads::shared;

my @hosts : shared;
my @hosts_alive : shared ;
my @running_threads;

my $NUMBER_THREADS;
my ($ipstring, $temp, $i);

if ($#ARGV < 0) {
        die "usa $0 aaa.bbb.ccc.ddd/mask\n";
}

my ($hexip, $mask) = split /\//, shift;
my ($a, $b, $c, $d) = split /\./, $hexip;

$mask = ($mask && $mask < 32 ? ~0x0 >> $mask : 0);
$hexip = ($a<<24) + ($b<<16) + ($c<<8) + ($d);
print (sprintf("0x%0.8x (%s) - 0x%0.8x (%s)\n", $hexip, ip2string($hexip), 
~$mask, ip2string(~$mask)));

$hexip &= ~$mask if ($mask);
$i = 0;
do {{
        $temp = $hexip + $i;
        # salta x.y.z.0
        next unless ($temp & 0xff);
        # salta x.y.z.255
        next if (($temp & 0xff) == 0xff);
        $ipstring = ip2string($temp);
        print (sprintf("0x%0.8x - %s\n", $temp, $ipstring));
        push @hosts, $ipstring;

}} while (++$i & ($mask));

# launch the threads
$NUMBER_THREADS = @hosts > 10 ? 10 : @hosts;
print "Creating $NUMBER_THREADS threads.\n";
for (1 .. $NUMBER_THREADS){
        push @running_threads, threads->create( \&scan, $_ );
}

# now, wait for them to complete their work.
while (@running_threads){
        $running_threads[0]->join;
        shift @running_threads;
}

print join ("\n", @hosts_alive);

exit(0);

sub ip2string {
        my $ip = shift;
        return sprintf("%d.%d.%d.%d",
                        ($ip & 0xff000000) >> 24,
                        ($ip & 0x00ff0000) >> 16,
                        ($ip & 0x0000ff00) >>  8,
                         $ip & 0x000000ff);
}

sub scan {

        my $current_host;
        my $me = shift || threads->tid();

        while (1){

                # try to get a first host to test
                LOCK_INIT_HOST: {
                        lock( @hosts );
                        $current_host = shift @hosts;
                }
                last unless defined($current_host);

                #print "[$me] provo host : $current_host\n";
                # we have a server to test:
                my $p = Net::Ping->new();

                if ($p->ping($current_host)){
                        $p->close();
                        print "[$me] $current_host is alive!\n";
                        # we store the result
                        LOCK_DONE: {
                                lock( @hosts_alive );
                                push @hosts_alive, $current_host;
                        }
                } else {
                        print "[$me] $current_host is dead.\n";
                }
        }
}

-- 
mattia
:wq!

Rispondere a