Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

system( ), printing output & matching

by zuinc (Novice)
on Apr 05, 2002 at 19:24 UTC ( #157032=perlquestion: print w/replies, xml ) Need Help??
zuinc has asked for the wisdom of the Perl Monks concerning the following question:

Im still a beginner at perl and am writing a script that should ping a list of IP addresses and print the results to a separate file. I would then like to search through that file for only valid IP addreses and then have them printed into another file. I figure this is the hard way to do things but Im still learning. =) My next step will be to telnet into those machines for which I will use EXPECT. But for now, I am able to ping those machines but their status is not printed to that file and Im not sure if my search through that file is working correctly. Heres what I have so far:
# Create a list of all possible IP addresses within subnet open(ALLIP, ">allip.list") || die "Unable to create file: allip.list\n +"; for ($i=0; $i<=20; $i++) { print ALLIP "$ip_subnet.$i\n"; } open(ALLIP, "allip.list") || die "Unable to open file: allip.list\n"; open(PINGALLIP, ">pingallip.list") || die "Unable to open file: pingal +lip.list"; while (<ALLIP>) { system("ping $_ >pingallip.list") && "Unable to create file: p +ingallip.l ist"; chomp; } open(OUTPUT, ">output.list"); open(PINGALLIP, "pingallip.list") || die "Unable to open file: pingall +ip.list"; my $line = 0; while (<PINGALLIP>) { chomp; #my $line = 0; #while (<ALLIP>) { #chomp; if ($_ eq~ m/is alive/) { $line++; last; } } close(ALLIP); if ($line) { print OUTPUT "$_\n"; } else { print "ERROR\n"; }
This keeps returning 'ERROR' and doesnt print anything to 'pingallip.list'. Any ideas? Thanks.

~Zuinc

Replies are listed 'Best First'.
Re: system( ), printing output & matching
by ozone (Friar) on Apr 05, 2002 at 19:42 UTC
    You've got several problems here:
    • you do a Perl 'open' on the file
    • you then do a Unix redirect to the file (which perl now has open - dangerous)
    • your Unix redirect doesn't append, it overwrites - you need a '>>' instead of a '>' before 'pingall.list' in your system call
    • then you don't close the file before opening it for read. This is not strictly a bad thing, but you should do this for neatness sake

    So, what I think is happening is that Perl has the file open, then you use system calls to write to it. Then you do the second Perl open, which causes perl to flush out what it thinks should be in the file (which is nothing) and so you land up with an empty file.

    check out Net::Ping for an easier way to do the pinging

      I made some changes but continue to get the same output, 'ERROR'. I know my code was kinda messy and i tried to clean it up by closing all the filehandles before reopening them and a few other changes. Heres what I have:
      # Create a list of all possible IP addresses within subnet open(ALLIP, ">allip.list") || die "Unable to create file: allip.list\n +"; for ($i=0; $i<=20; $i++) { print ALLIP "$ip_subnet.$i\n"; } close(ALLIP); open(ALLIP, "allip.list") || die "Unable to open file: allip.list\n"; open(PINGALLIP, ">pingallip.list") || die "Unable to open file: pingal +lip.list"; while (<ALLIP>) { system("ping $_ >pingallip.list") && "Unable to create file: p +ingallip.l ist"; chomp; } close(ALLIP); close(PINGALLIP); open(OUTPUT, ">output.list"); open(PINGALLIP, "pingallip.list") || die "Unable to open file: pingall +ip.list"; my $line = 0; while (<PINGALLIP>) { chomp; if ($_ =~ m/is alive/) { $line++; last; } } close(PINGALLIP); if ($line) { print OUTPUT "$_\n"; } else { print "ERROR\n"; }
      Any more help would be greatly appreciated. ~_^

      ~Zuinc
        open(ALLIP, "allip.list") || die "Unable to open file: allip.list\n"; while (<ALLIP>) { chomp; system("ping $_ >>pingallip.list"); }
Re: system( ), printing output & matching
by grinder (Bishop) on Apr 05, 2002 at 20:27 UTC

    You know of course that you can perform pings from Perl with Net::Ping? The script does have to be setuid root, though, if you want to use ICMP packets (if this means nothing to you, then you do want to be using them).

    If the IP addresses of the machine you are pinging are within a single network, you might be interested in a script I posted a while back: pinger - ping a range of hosts. There may be some ideas you can use.


    print@_{sort keys %_},$/if%_=split//,'= & *a?b:e\f/h^h!j+n,o@o;r$s-t%t#u'
Re: system( ), printing output & matching
by earthboundmisfit (Chaplain) on Apr 05, 2002 at 19:35 UTC
    Do you really mean
     if ($_ eq~ m/is alive/) {
                    $line++;
                    last;
            }
    
    
    ??

    should be =~

Re: system( ), printing output & matching
by talexb (Canon) on Apr 05, 2002 at 19:39 UTC
    It looks like you are doing something funky with files at the beginning .. opening a file, writing some stuff to the file, then opening it again for reading (but you haven't closed it yet or seeked back to the beginning). This is odd.

    So, apart from that, what happens when you try running it under the debugger?

    --t. alex

    "Here's the chocolates, and here's the flowers. Now how 'bout it, widder hen, will ya marry me?" --Foghorn Leghorn

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (7)
As of 2018-11-20 12:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My code is most likely broken because:
















    Results (223 votes). Check out past polls.

    Notices?