2010-10-18 4 views
5

Tentative d'intégration du doublage Perl suivant dans un script shell. Ce code fonctionne à l'intérieur d'un script Perl mais pas en tant que doublure exécutée à partir d'un script shell.Comment puis-je effectuer un ping sur un hôte avec un doubleur Perl avec Net :: Ping?

J'ai essayé de remplacer $host par un vrai nom d'hôte sans succès.

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

Pourquoi utilisez-vous perl au lieu de simplement 'ping'? –

+0

Je l'ai intégré dans un script shell déjà écrit que je ne tiens pas à porter. Cela constitue un interligne simple, pratique et rapide (c'est-à-dire qui ne se bloque pas) qui fonctionne sur plusieurs plates-formes. –

Répondre

1

Essayez de remplacer $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;' 

avec $ARGV[0], le premier argument de ligne de commande:

$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

J'ai presque pensé à faire ça mais je me suis détourné. Cependant, cela me donne une option supplémentaire que je peux intégrer dans ce script. Merci ... –

9

Les guillemets simples dans la coquille arrêter l'hôte $ d'être interprété. Ainsi, vous pouvez simplement arrêter et redémarrer les guillemets simples comme requis:

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

Vous pouvez également passer l'hôte en tant que paramètre - voir l'autre réponse.

+0

Doh, tout comme avec sed. Merci un million. –

0

Si vous souhaitez utiliser Perl, utilisez l'interpréteur Perl pour exécuter votre script.

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

Sinon, vous pourriez aussi bien utiliser la commande ping directement à partir du shell

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

Merci. Je suis d'accord - utiliser exclusivement perl exclusivement. J'ai intégré ceci dans un script shell déjà écrit que je ne tiens pas à porter. Cela sert de pratique, toujours rapide (c'est-à-dire, ne pas accrocher) one-liner. –