----- 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>