jantelar has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to scan a bunch of networks with Nmap::Scanner, and it usually works pretty nice. From time to time though I get this error:

<nmap-error> <pid="22631"/> <cmdline="'/usr/bin/nmap' -v -v -v -v -sP 10.8.179.48/28 -oX -"/> <nmap-err>RTTVAR has grown to over 2.3 seconds, decreasing to 2.0 </nmap-msg> </nmap-error>

I suspect this is related to the fact that some networks are based on GSM/EDGE, ie very sloooow. The problem is that the scanner breaks the while loop. I want to catch the error, and move on to the next net.

My simplified code:

#!/usr/bin/perl use warnings; use strict; use DBI; use Nmap::Scanner; my $sth = $dbh->prepare("Some valid SQL"); $sth->execute(); while(my @r = $sth->fetchrow_array()) { print STDERR "Scan network $r[0], mask $r[1]\n"; my $scanner = new Nmap::Scanner; $scanner->max_rtt_timeout(10000); $scanner->min_rtt_timeout(1000); $scanner->host_timeout(5000); $scanner->max_parallelism(8); my $results = $scanner->scan("-v -sP $r[0]/$r[1]"); print STDERR "Scan completed\n"; my $hsts = $results->get_host_list(); while(my $host = $hsts->get_next()) { # Do stuff for each ... } } exit 0;

Any hints on how to solve this is appreciated.

Replies are listed 'Best First'.
Re: Nmap::Scanner breaks my while loop, I think
by choroba (Cardinal) on Feb 13, 2012 at 16:19 UTC
    If calling ->scan calls die inside, you can use eval:
    my $results; eval { $results = $scanner->scan("-v -sP $r[0]/$r[1]"); 1; } or warn " +Error catched: $@";

      I really dont know what ->scan does upon errors. What I have tried is this:

      my $results; eval{ $results = $scanner->scan("-v -sP $r[0]/$r[1]"); }; print STDERR "Error catched: $@\n" if($@);

      But, this does not catch it. The while loop still ends right there.

        The while loop still ends right there.
        Are you sure? Is not it one line later? You should not call
        $results->get_host_list();
        if $results is empty.
Re: Nmap::Scanner breaks my while loop, I think
by roboticus (Chancellor) on Feb 13, 2012 at 16:14 UTC

    jantelar:

    Breaks the while loop? What do you mean?

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

Re: Nmap::Scanner breaks my while loop, I think
by Khen1950fx (Canon) on Feb 13, 2012 at 16:52 UTC
    Works for me.
    #!/usr/bin/perl use strict; use Nmap::Scanner; $| = 1; my @targets = "209.197.123.153", "216.92.34.251"; my $scanner = new Nmap::Scanner; $scanner->tcp_syn_scan(); $scanner->debug(1); $scanner->add_scan_port('1-1024'); $scanner->guess_os(); $scanner->max_rtt_timeout("200ms"); $scanner->add_target("66.39.54.27"); $scanner->max_parallelism(8); my $results = $scanner->scan(@targets); print $results->as_xml; my $host_list = $results->get_host_list(); while(my $host = $host_list->get_next()) { print "Found host named: ", $host->hostname() . "\n"; } exit 0;