2012-08-15 4 views
1
#!/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 ping failure

$ 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 

Я понятия не имел, даже у меня есть увеличение пинг тайм-аут, но результаты те же

+0

Настоящая причина может быть в брандмауэре на 192.168.0.168, как я описал в своем ответе ... – CyberDem0n

ответ

4

The проблема только в том, что команда ping использует протокол ICMP по умолчанию, а Net::Ping использует TCP. Вы можете переключиться на Net::Ping ICMP путем создания объекта, как это:

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

принять к сведению, что делает ICMP пинги требует корневой привилегии Unix.

+0

Это сработало для меня. Благодарю. Но нужно выяснить реальную причину. – k119

+1

Если это сработало, то машина, стоящая за 192.168.0.168, не отвечает на TCP-пинг, или есть брандмауэр, блокирующий TCP-пинг. Я сомневаюсь, что реальная проблема заключается в вашей программе. – tauli

1

Для того, чтобы отправить ICMP-пакеты вы должны иметь права на создание сырьевой сокеты, т. е. имеют права root.
Я полагаю, вы работаете ping.pl как обычный пользователь, но вы должны быть суперпользователь

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

программы звон имеет битые с битом, который позволяет запускать программу звона с корневыми правами.

По умолчанию Net :: Ping пытается подключиться к порту echo (7/tcp), если он получает ECONNREFUSED - это означает, что хост встал, но отказывается от соединения (ничто не прослушивает этот порт). если соединение прерывается по таймауту, это означает, что хост отключен.

Но! Я могу блокировать все подключения к 7/TCP с помощью брандмауэра:

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

и ... вуаля, я получаю down вместо alive

Итак, вы должны проверить брандмауэр на вашем failure pinged хозяина

+0

Он написал: «Он отлично работал во всех случаях, кроме IP 192.168.0.168», поэтому я предполагаю, что должно быть какое-то другое исключение. Кроме того, модуль «Net :: Ping» не использует установленную программу ping. Документы (http://perldoc.perl.org/Net/Ping.html) говорят, что протокол по умолчанию (tcp) не требует специальных привилегий. – mpe

Смежные вопросы