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!