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チェックを行っています。IP192.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::PingTCPを使用することです。Net::Ping次のようにオブジェクトを作成することで、ICMPに切り替えることができます。

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

ICMP pingを作成するには、Unixでroot権限が必要であることに注意してください。

于 2012-08-15T12:08:38.410 に答える
1

icmpパケットを送信するには、rawソケットを作成する権限、つまり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 に答える