我在一个不允许使用“ping”应用程序的 Linux 系统上(ping: icmp open socket: Operation not allowed)。但是,我正在编写的脚本(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
.
也就是说,还有其他方法可以确定机器是否还活着。如果已知有一台服务器始终在机器上运行,您可以尝试连接到它。请注意,您不需要完成连接(例如登录),只要您可以成功启动连接就足以知道该框已启动。
或者您可以在 unix 上的“ping”程序上设置 SUID 位;)
要执行 ping (ICMP),您需要 root 访问权限。
您唯一的方法是执行TCP 或 UDP ping。如果你想要一个例子检查Cacti的代码,或者你可以使用 hping 为你做
http://us2.php.net/manual-lookup.php?pattern=socket
但是如果你不能用 ping 打开一个套接字,你就不可能使用其中的任何一个。与您的托管服务提供商交谈。
PHP 手册为用户提供了在 PHP 中执行ping 的代码。不幸的是,它需要 root 访问权限,因此您也不太可能使用它。一种替代方法是使用 curl 并查看curl_getinfo()返回的值:
c = curl_init('http://www.site.com/');
curl_exec($c);
$info = curl_getinfo($ch);
它远不等同于 ping,但仍可能适合您的需求。