在不使用“ping”的情况下从动态语言Ping

时间:2009-06-18 02:39:44

标签: php linux unix command-line-interface packet

我在Linux系统上,我不允许使用'ping'应用程序(ping:icmp open socket:不允许操作)。但是,我正在编写的脚本(PHP,但我可以使用exec()调用任何脚本/程序,如果需要)需要确定主机是否“活着”。如何在不使用“ping”的情况下解决这个问题?

5 个答案:

答案 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,但仍然可能适合您的需求。