'ping'アプリケーションの使用が許可されていないLinuxシステムを使用しています(ping:icmp open socket:操作は許可されていません)。ただし、私が書いているスクリプト(PHPですが、必要に応じて任意のスクリプト/プログラムへのexec()呼び出しを使用できます)は、ホストが「生きている」かどうかを判断する必要があります。'ping'を使用せずにこれを実行するにはどうすればよいですか?
5 に答える
pingで実行できない場合は、別の言語で実行できません。これは、理由を理解するのに役立つ可能性のある例えです。ファイルシステムにファイルがあり、その内容を知りたいとしましょう。あなたが走るcat filename
と、それは言うcat: filename: Permission denied
。Perl(または他の言語)はCがここで行ったよりも公平だと思いますか?やってみよう:
#!/usr/bin/perl
use strict;
use warnings;
die "usage: $0 filename" unless @ARGV == 1;
my $filename = shift;
open my $fh, "<", $filename
or die "could not open $filename: $!\n";
print while <$fh>;
ファイルに対して実行すると、と表示されますcould not open filename: Permission denied
。使用しようとしている言語に関係なく、を取得しますOperation not permitted
。
とはいえ、マシンが稼働しているかどうかを判断する方法は他にもあります。マシン上で常に実行されていることがわかっているサーバーがある場合は、そのサーバーへの接続を試みることができます。接続を終了する必要はないことに注意してください(ログインなど)。接続を正常に開始できるという事実だけで、ボックスが起動していることを知ることができます。
ping(ICMP)を実行するには、rootアクセスが必要です。
あなたが持っている唯一の方法は、TCPまたはUDPpingを実行することです。例が必要な場合は、 Cactiのコードを確認するか、hpingを使用してそれを行うことができます
または、UNIXの「ping」プログラムにSUIDビットを設定できます;)
http://us2.php.net/manual-lookup.php?pattern=socket
ただし、pingでソケットを開くことができない場合は、これらのいずれかを使用できる可能性はほとんどありません。ホスティングプロバイダーに相談してください。
PHPマニュアルには、PHPでpingを実装するためのユーザー提供のコードが記載されています。残念ながら、rootアクセスが必要なため、rootアクセスも使用できない可能性があります。1つの代替方法は、curlを使用して、curl_getinfo()によって返される値を確認することです。
c = curl_init('http://www.site.com/');
curl_exec($c);
$info = curl_getinfo($ch);
pingと同等にはほど遠いですが、それでもニーズに適している可能性があります。