2010-10-18 3 views
5

Der Versuch, den folgenden Perl-One-Liner in ein Shell-Skript zu integrieren. Dieser Code funktioniert innerhalb eines Perl-Skripts, jedoch nicht als Einzeiler, der von einem Shell-Skript ausgeführt wird.Wie kann ich einen Host mit einem Perl-Einzeiler mit Net :: Ping anpingen?

Ich habe versucht, $host mit einem echten Hostnamen ohne Glück zu ersetzen.

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

Warum sind Sie Perl verwenden, anstatt nur 'ping'? –

+0

Ich habe dies in ein bereits geschriebenes Shell-Skript integriert, das ich nicht portieren möchte. Dies dient als bequemer, gleich bleibend schneller (das heißt, es hängt nicht) Einliner, der plattformübergreifend arbeitet. –

Antwort

1

Try $host zu ersetzen:

$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;' 

mit $ARGV[0], dem ersten Argumente Befehlszeile:

$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

Ich habe 'fast' daran gedacht, aber ich wandte mich ab. Dies gibt mir jedoch eine zusätzliche Option, die ich in dieses Skript integrieren kann. Danke ... –

9

Die einfachen Anführungszeichen in der Schale von dem $ Host stoppt interpretiert wird. So können Sie einfach aufhören und die einfachen Anführungszeichen Neustart nach Bedarf:

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

Alternativ können Sie den Host in als Parameter übergeben - die andere Antwort sehen.

+0

Doh, genau wie bei sed. Tausend Dank. –

0

Wenn Sie Perl verwenden möchten, verwenden Sie den Perl-Interpreter, um Ihr Skript auszuführen.

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

Andernfalls könnten Sie auch verwenden, um die ping Befehl direkt von der Shell

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

Danke. Ich stimme zu - verwenden Sie ausschließlich Perl. Ich habe dies in ein bereits geschriebenes Shell-Skript integriert, das ich nicht portieren möchte. Dies dient als bequemer, durchgängig schneller (dh es hängt nicht) Einstrich. –

Verwandte Themen