2010-10-18 10 views
5

Intentando integrar el siguiente Perl one-liner en un script de shell. Este código funciona dentro de una secuencia de comandos de Perl, pero no como una sola línea ejecutada desde un script de shell.¿Cómo puedo hacer ping a un host con un Perl one-liner con Net :: Ping?

He intentado reemplazar $host con un nombre de host real sin suerte.

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

¿Por qué utiliza Perl en lugar de simplemente 'ping'? –

+0

He integrado esto en un script de shell ya escrito que no me importa portar. Esto sirve como una solución conveniente, consistentemente rápida (es decir, no se bloquea) que funciona en todas las plataformas. –

Respuesta

1

tratar de sustituir $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;' 

con $ARGV[0], el primer argumento de la línea de comandos:

$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

Casi pensé en hacer esto, pero me alejé. Sin embargo, esto me da una opción adicional que puedo integrar en este script. Gracias ... –

9

Las comillas simples dentro de la cáscara detener el anfitrión $ sea interpretado. Por lo que sólo puede detener y reiniciar las comillas simples como sea necesario:

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

Alternativamente, se puede pasar el anfitrión como un parámetro - ver la otra respuesta.

+0

Doh, al igual que con sed. Un millón de gracias. –

0

Si desea utilizar Perl, utilice el intérprete Perl para ejecutar su secuencia de comandos.

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

De lo contrario, puede ser que también utilice el comando ping directamente de la cáscara

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

Gracias. Estoy de acuerdo, solo use Perl exclusivamente. Integré esto en un script de shell ya escrito que no me importa portar. Esto sirve como un conveniente, consistentemente rápido (es decir, no se bloquea) de un solo liner. –