2010-10-18 65 views
5

嘗試將以下Perl單線程整合到shell腳本中。此代碼在Perl腳本中工作,但不能作爲從shell腳本執行的單行程序。如何使用Perl :: Net :: Ping單線程來ping主機?

我試着用真正的主機名替換$host,但沒有運氣。

#!/bin/ksh 

hosts="host1 host2 host3" 

PERL=/usr/bin/perl 

# Check to see if hosts are accessible. 
for host in $hosts 
do 
    #echo $host 
    $PERL -e 'use Net::Ping; $timeout=5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$host is alive \n" if $p->ping($host); $p->close;' 
done 
+3

? – 2010-10-18 15:24:46

+0

我將它集成到一個已經寫好的shell腳本中,我並不關心它的移植。這可以作爲一種方便,持續快速(即不掛起)跨平臺工作的單線程。 – 2010-10-18 16:00:28

回答

1

嘗試更換$host

$PERL -e 'use Net::Ping; $timeout=5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$host is alive \n" if $p->ping($host); $p->close;' 

$ARGV[0],第一個命令行參數:

$PERL -e 'use Net::Ping; $timeout=5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$ARGV[0] is alive \n" if $p->ping($ARGV[0]); $p->close;' $host 
+0

我'幾乎'想到這樣做,但轉身離去。不過,這給了我一個額外的選項,我可以將其集成到此腳本中。謝謝... – 2010-10-18 16:03:30

9

在外殼的單引號被解釋停止$主機。所以,你可以只是停止和重新啓動需要單引號:

perl -MNet::Ping -e 'if (Net::Ping->new("icmp", 5)->ping("'$host'")) {print "'$host' is alive\n"}' 

或者,您可以通過主機作爲一個參數 - 看對方的回答。

+0

Doh,就像sed。太感謝了。 – 2010-10-18 15:49:01

0

如果你想使用Perl,那麼使用Perl解釋器來運行你的腳本。

#!/usr/bin/env perl -w 
use Net::Ping; 
$timeout=5; 
$p=Net::Ping->new("icmp", $timeout) or die bye ; 
@hosts=qw/localhost 10.10.10.10/; 
foreach my $host (@hosts) { 
    print "$host is alive \n" if $p->ping($host); 
} 
$p->close; 

否則,你還不如直接你爲什麼用perl,而不是僅僅`ping`使用ping命令從shell

#!/bin/bash 
for hosts in host1 host2 host3 
do 
    if ping ...... "$hosts" >/dev/null ;then 
     ..... 
    fi 
done 
+0

謝謝。我同意 - 只使用perl。我將它集成到一個我已經寫好的shell腳本中,我不介意移植它。這是一個方便,一貫快速(也就是說,不掛)單線程。 – 2010-10-18 15:57:46