2010-10-18 11 views
5

Aşağıdaki Perl one-liner'ı bir kabuk komut dosyasına entegre etmeye çalışıyorum. Bu kod, bir Perl betiği içinde çalışır, ancak bir kabuk betiğinden yürütülen tek liner olarak değil.Net :: Ping ile Perl one-liner ile bir ana bilgisayara nasıl ping yapabilirim?

$host yerine gerçek bir ana bilgisayar adı ile şans denemeyi denedim. $host yerine

#!/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

doğrudan ping komutunu kullanabilir? –

+0

Bunu, bağlantı noktası umurumda değil zaten yazılmış bir kabuk komut dosyasına entegre ettim. Bu, platformlar boyunca çalışan tek katlı, uygun, sürekli olarak hızlı (yani, askıda kalmaz) olarak hizmet eder. –

cevap

1

Dene:

$ARGV[0] ile
$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;' 

, ilk komut satırı argümanı: kabuğunda

$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

Ben neredeyse bunu yapmayı düşündüm ama geri döndü. Ancak, bu bana bu betiğe ekleyebileceğim ek bir seçenek sunuyor. Teşekkürler ... –

9

tek tırnak yorumlanmasını önlemek $ konak durdurun. Yani sadece durdurmak ve gerektiği gibi tek tırnak yeniden başlatabilirsiniz:

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

Alternatif olarak, bir parametre olarak ev sahibini geçebilir - diğer yanıt bakın.

+0

Doh, tıpkı sed ile. Bir milyona teşekkürler. –

0

Perl'i kullanmak isterseniz, betiğinizi çalıştırmak için Perl yorumlayıcısını kullanın.

#!/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; 

Aksi takdirde, hem Neden sadece `ping` Perl yerine kullandığınız kabuk

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

Teşekkürler. Katılıyorum - sadece perl kullanın. Bunu, limana önem vermediğim, önceden yazılmış bir kabuk senaryosuna entegre ettim. Bu, tek astarlı uygun, sürekli olarak hızlı (yani, askıda kalmaz) olarak hizmet eder. –

İlgili konular