Here it's from my side.
=head1 DESCRIPTION host_ping work around of no permission to use ping =cut use strict; use warnings; use Net::Ping; my $host = shift or die "specify host\n"; my $timeout = shift || 15; my $ping = Net::Ping->new(); if ($ping->ping($host, $timeout)) { print "box is up\n"; exit 0; } else { print "box is down\n"; exit 1; } -Regds. Kumud. ----- Original Message ----- From: Tyson Sommer <[EMAIL PROTECTED]> Date: Thursday, February 17, 2005 11:42 am Subject: RE: Capturing the results from Expect with backtick > > > > -----Original Message----- > > From: glidden, matthew [EMAIL PROTECTED] > > Sent: Thursday, February 17, 2005 10:15 AM > > To: 'beginners@perl.org' > > Subject: Capturing the results from Expect with backtick > > > > I'm using combined perl and Expect scripts to do the following: > > > > 1. ping a host using expect (for technical reasons, I've had > > better luck using expect than perl here) 2. for each system > > that responds to ping, perform a series of rsh commands via perl > > > > The expect script is this, where $hosts is a list of > > potential names to > > ping: > > > > foreach h $hosts { > > spawn ping $h > > > > expect { > > icmp_seq { > > puts $h > > exit 0 > > } > > } > > } > > > > puts "" > > exit -1 > > > > Calling the expect script looks like this, where $sName is > > the system name: > > > > my $sPing = `./ping.exp $sName`; > > > > Later on, I check the results like this: > > > > if ($sPing ne '') { > > print "$sPing is up"; > > [rsh commands] > > } else { > > print "$sName is down"; > > } > > > > When I run this from a terminal window, it returns the pinged > > name and everything works fine. However, I need it automated, > > so I set up a cron job. > > The cron job never pings the hosts successfully--everything > > returns as "down." My hunch is that it has to do with using > > "puts" in Expect and backtick in perl--do they need a STDOUT > > stream to work properly? How can I set this up to ping > > properly while automated? > > > > Matthew > > > You shouldn't need Expect. I've had great success with something > like this > (I'm sure there's a more condensed way to write it, but this works > everytime): > > > ... > > ### open ping command with filehandle so we can grab the STDERR (in > case of Unknown Host) using the 2>&1 and pipe > ### Also using switches to make ping faster and limit to only four > pings -- tailor to suit your needs > open (PINGTEST, 'ping -c 4 -i .2 -w 3 ' . $sName . ' 2>&1 |') || die > "Can't run PING!!!\n"; > > ### set $ping_data to result of <PINGTEST> using join() to put into > scalar context > my $ping_data = join ("", <PINGTEST>); > > ### print $ping_data if debugging (useful for checking results of > open() above) > print "\n$ping_data\n" if $debug; > > > ######### Might have to change one or more of the following regexes > ######## > ######### depending on how your system returns ping data > ######## > > ### search $ping_data string... > if ( $ping_data !~ /bytes\sfrom/ ) { ### <-- REGEX HERE > > if ( $ping_data =~ /unknown\shost/ ) { ### <-- REGEX HERE > > ### ...and set $error if device unknown... > $error = "$sName unknown!!\n"; > > } elsif ( $ping_data =~ /100% loss/ ) { ### <-- REGEX HERE > > ### ...or set $error if device known but > unreachable... > $error = "$sName is down!!\n"; > > } > } else { > > ### ...or set $error to "successful" if we are > $error = "$sName is up!\n"; > } > > ... > > > If anyone can make this simpler, let me know! Why not use Net::Ping module ?? Here is an example #!PERL use warnings; use strict; use Net::Ping; my $pinger = Net::Ping->new("icmp") || die "error: $!\n"; my $host = "myhost"; if( $pinger->ping($host,2) ){ print "$host is online\n"; } else{ print "$host is offline\n"; } > > > > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > <http://learn.perl.org/> <http://learn.perl.org/first-response> > > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response> This e-mail and any files transmitted with it are for the sole use of the intended recipient(s) and may contain confidential and privileged information. If you are not the intended recipient, please contact the sender by reply e-mail and destroy all copies of the original message. Any unauthorised review, use, disclosure, dissemination, forwarding, printing or copying of this email or any action taken in reliance on this e-mail is strictly prohibited and may be unlawful.