我在Linux系统上,我不允许使用'ping'应用程序(ping:icmp open socket:不允许操作)。但是,我正在编写的脚本(PHP,但我可以使用exec()调用任何脚本/程序,如果需要)需要确定主机是否“活着”。如何在不使用“ping”的情况下解决这个问题?
答案 0 :(得分: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
。
也就是说,还有其他方法可以确定机器是否存活。如果已知服务器始终在计算机上运行,则可以尝试连接到该服务器。请注意,您不需要完成连接(例如登录),只需要您可以成功启动连接即可知道该框已启用。
答案 1 :(得分:1)
要执行ping(ICMP),您需要root访问权限。
您唯一的方法是执行 TCP或UDP ping 。 如果您想要一个示例,请检查Cacti的代码,或者您可以使用hping为您执行此操作
答案 2 :(得分:1)
或者你可以在unix上设置“ping”程序的SUID位;)
答案 3 :(得分:0)
http://us2.php.net/manual-lookup.php?pattern=socket
但是如果你不能用ping打开一个套接字,你就不可能使用其中任何一个。与您的托管服务提供商联系。
答案 4 :(得分:0)
PHP手册为用户提供了ping in PHP实现的代码。不幸的是,它需要root访问权限,所以你也不可能使用它。另一种方法是使用curl并查看curl_getinfo()返回的值:
c = curl_init('http://www.site.com/');
curl_exec($c);
$info = curl_getinfo($ch);
它远不等同于ping,但仍然可能适合您的需求。