2012-08-15 97 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失敗

$ 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超時,但結果相同

+0

真正的原因可能是在192.168.0.168的防火牆上,正如我在我的回答中所描述的那樣... – CyberDem0n 2012-08-15 12:42:52

回答

4

上檢查防火牆唯一我能想到的問題是,ping命令使用ICMP協議作爲默認值,而Net::Ping使用TCP。您可以通過創建你的對象這樣的切換Net::Ping到ICMP:

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

。注意到,這使得ICMP ping需要在Unix root權限。

+0

這對我有用。謝謝。但需要找出真正的原因。 – k119 2012-08-15 12:24:30

+1

如果有效,那麼192.168.0.168後面的機器不會迴應TCP ​​ping或者有防火牆阻止TCP ping。我懷疑真正的問題在於你的計劃。 – tauli 2012-08-15 12:50:06

1

爲了發送ICMP數據包,你必須有權限創建原始套接字,即具有根權限。
我想你ping.pl作爲普通用戶運行,但是你必須要根

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主機

+0

他寫道:「它工作正常,除IP 192.168.0.168以外的所有情況」,所以我猜測必須有其他例外。此外,'Net :: Ping'模塊不使用安裝的ping程序。文檔(http://perldoc.perl.org/Net/Ping.html)表示默認協議(tcp)不需要特殊權限。 – mpe 2012-08-15 11:50:35