perl ping失败

时间:2012-08-15 11:41:44

标签: perl

#!/usr/bin/perl
use Net::Ping;
$p = Net::Ping->new();
my $main_ip="$ARGV[0]";

if ($p->ping($main_ip,1)){
    $result=true;
    print "$main_ip is alive \n";
}else{
    print "$main_ip is down \n";
}

我使用上面的perl脚本来ping服务器。除IP 192.168.0.168外,所有情况都很好。

$ perl test.pl 192.168.0.168

192.168.0.168已关闭

]$ ping 192.168.0.168

PING 192.168.0.168 (192.168.0.168) 56(84) bytes of data.
64 bytes from 192.168.0.168: icmp_seq=1 ttl=64 time=0.304 ms
64 bytes from 192.168.0.168: icmp_seq=2 ttl=64 time=0.355 ms
64 bytes from 192.168.0.168: icmp_seq=3 ttl=64 time=2.94 ms
64 bytes from 192.168.0.168: icmp_seq=4 ttl=64 time=0.388 ms

--- 192.168.0.168 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3292ms
rtt min/avg/max/mdev = 0.304/0.997/2.944/1.124 ms

]$ ping 192.168.0.18

PING 192.168.0.18 (192.168.0.18) 56(84) bytes of data.
From 192.168.0.181 icmp_seq=2 Destination Host Unreachable
From 192.168.0.181 icmp_seq=3 Destination Host Unreachable
From 192.168.0.181 icmp_seq=4 Destination Host Unreachable

--- 192.168.0.18 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3292ms
pipe 3

]$ perl test.pl 192.168.0.18

192.168.0.18 is down 

即使我增加ping超时但结果相同,我也不知道

2 个答案:

答案 0 :(得分:5)

我能想到的唯一问题是,ping命令使用ICMP协议作为默认值,而Net::Ping使用TCP。您可以通过以下方式创建对象来将Net::Ping切换到ICMP:

my $p = Net::Ping->new( 'icmp' );

请注意,使ICMP ping需要Unix上的root权限。

答案 1 :(得分:1)

要发送icmp数据包,您必须拥有创建原始套接字的权限,即拥有root权限 我想你以普通用户身份运行ping.pl,但你需要是root

ls -al `which ping`
-rws--x--x 1 root root 39640 Dec 17  2011 /bin/ping
   ^
   |
   suid bit

ping程序有一个suid位,允许以root权限运行ping程序。

默认情况下,Net :: Ping会尝试连接到echo端口(7 / tcp),如果它获得ECONNREFUSED - 这意味着主机已启动但拒绝连接(没有任何内容正在侦听该端口)。如果连接在超时时中断,则表示主机已关闭。

但是!我可以通过防火墙阻止所有与7 / tcp的连接:

iptables -I INPUT -p tcp --dport 7 -j DROP

并且......瞧,我得down而不是alive

因此,您应该检查failure pinged主机上的防火墙