0

我在一个不允许使用“ping”应用程序的 Linux 系统上(ping: icmp open socket: Operation not allowed)。但是,我正在编写的脚本(PHP,但如果需要,我可以对任何脚本/程序使用 exec() 调用)需要确定主机是否“活动”。如果不使用“ping”,我怎么能做到这一点?

4

5 回答 5

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.

也就是说,还有其他方法可以确定机器是否还活着。如果已知有一台服务器始终在机器上运行,您可以尝试连接到它。请注意,您不需要完成连接(例如登录),只要您可以成功启动连接就足以知道该框已启动。

于 2009-06-18T10:52:28.213 回答
1

或者您可以在 unix 上的“ping”程序上设置 SUID 位;)

于 2011-03-29T22:08:08.130 回答
1

要执行 ping (ICMP),您需要 root 访问权限。

您唯一的方法是执行TCP 或 UDP ping。如果你想要一个例子检查Cacti的代码,或者你可以使用 hping 为你做

于 2009-06-18T15:10:04.047 回答
0

http://us2.php.net/manual-lookup.php?pattern=socket

但是如果你不能用 ping 打开一个套接字,你就不可能使用其中的任何一个。与您的托管服务提供商交谈。

于 2009-06-18T02:46:41.733 回答
0

PHP 手册为用户提供了在 PHP 中执行ping 的代码。不幸的是,它需要 root 访问权限,因此您也不太可能使用它。一种替代方法是使用 curl 并查看curl_getinfo()返回的值:

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

它远不等同于 ping,但仍可能适合您的需求。

于 2009-06-18T03:11:28.733 回答