如何使用Net :: Ping使用Perl单线程来ping主机?

时间:2010-10-18 15:18:15

标签: perl

尝试将以下Perl one-liner集成到shell脚本中。此代码在Perl脚本中工作,但不能作为从shell脚本执行的单行程序。

我尝试用真正的主机名替换$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 个答案:

答案 0 :(得分:9)

shell中的单引号会阻止$ host被解释。因此,您可以根据需要停止并重新启动单引号:

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

或者,您可以将主机作为参数传递 - 请参阅其他答案。

答案 1 :(得分: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

答案 2 :(得分: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;

否则,您也可以直接从shell

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