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"; 
} 

J'utilise le script ci-dessus perl pour vérifier le serveur ping. Il a bien fonctionné tous les cas sauf pour IP 192.168.0.168.échec de ping perl

$ perl test.pl 192.168.0.168 

192.168.0.168 est en baisse

]$ 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 

je n'avais pas la moindre idée même je délai d'attente augmentation de ping mais les résultats mêmes

+0

raison réelle peut être dans le pare-feu sur 192.168.0.168, comme je l'ai décrit dans ma réponse ... – CyberDem0n

Répondre

4

Le Le seul problème que je peux penser est, que la commande ping utilise le protocole ICMP par défaut, tandis que Net::Ping utilise TCP. Vous pouvez passer à Net::Ping ICMP en créant votre objet comme celui-ci:

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

Prenez note, que faire pings ICMP nécessite des privilèges root sur Unix.

+0

Cela a fonctionné pour moi. Merci. Mais besoin de trouver la vraie raison. – k119

+1

Si cela a fonctionné, alors la machine derrière 192.168.0.168 ne répond pas aux pings TCP ou il y a un pare-feu bloquant le ping TCP. Je doute que le vrai problème réside dans votre programme. – tauli

1

Afin d'envoyer des paquets ICMP vous devez disposer des droits pour créer des premières sockets, c'est à dire avoir des droits root.
Je suppose que vous en cours d'exécution ping.pl en tant qu'utilisateur ordinaire, mais vous devez être root

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

programme ping a un peu suid, ce qui permet d'exécuter le programme ping avec les droits root.

Par défaut Net :: Ping essaie de se connecter au port echo (7/tcp), s'il obtient ECONNREFUSED - cela signifie que l'hôte est en haut mais refuse la connexion (rien n'écoute sur ce port). Si connect interrompt le timeout, cela signifie que l'hôte est en panne.

Mais! Je peux bloquer toutes les connexions à 7/tcp par pare-feu:

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

et ... le tour est joué, je reçois down au lieu de alive

Donc, vous devriez vérifier pare-feu sur votre failure pinged hôte

+0

Il a écrit "Cela a bien fonctionné tous les cas, sauf pour IP 192.168.0.168", donc je suppose qu'il doit y avoir d'autres exception. De plus, le module 'Net :: Ping' n'utilise pas le programme ping installé. Les documents (http://perldoc.perl.org/Net/Ping.html) indiquent que le protocole par défaut (tcp) ne nécessite pas de privilèges spéciaux. – mpe