2
#!/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 超时,我也不知道,但结果相同

4

2 回答 2

5

我能想到的唯一问题是,ping 命令默认使用 ICMP 协议,而Net::Ping使用 TCP。您可以通过像这样创建对象来切换Net::Ping到 ICMP:

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

请注意,在 Unix 上进行 ICMP ping 需要 root 权限。

于 2012-08-15T12:08:38.410 回答
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防火墙

于 2012-08-15T11:46:22.073 回答