2009-06-18 65 views
0

我在Linux系統中不允許使用'ping'應用程序(ping:icmp open socket:Operation not permitted)。但是,我正在編寫的腳本(PHP,但如果需要,我可以使用exec()調用任何腳本/程序)需要確定主機是否「活着」。我怎樣才能在不使用'ping'的情況下解決這個問題?從動態語言ping而不使用'ping'

回答

2

如果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

也就是說,還有其他方法來確定機器是否還活着。如果已知某臺服務器始終在機器上運行,則可以嘗試連接到該服務器。請注意,您不需要完成連接(例如登錄),只需成功啓動連接即可​​知道該框已啓動。

0

PHP手冊爲用戶提供的代碼實現了ping in PHP。不幸的是,它需要root訪問權限,所以你也不太可能使用它。一種選擇是使用捲曲,並期待在由curl_getinfo()返回值:

c = curl_init('http://www.site.com/'); 
curl_exec($c); 
$info = curl_getinfo($ch); 

它遠不及等價於平,但仍可能適合您的需求。

1

要執行ping(ICMP),您需要root訪問權限。

你唯一的辦法是做一個TCP或UDP ping。 如果你想要一個例子檢查Cacti代碼,也可以使用hping來爲你做它

1

或者你也可以設置在UNIX上的「ping」程序SUID位;)