PHP 执行 Ping 命令

PHP 执行 Ping 命令

我以前问过这个问题,但没有什么收获。我想我当时搞混了,没有正确地提出我的问题。所以又问了一遍。

我开始之前有几点要说:

  1. 我正在运行 FC 14
  2. 我没有手动安装 apache...使用 yum
  3. PHP 中的安全模式已关闭

基本上我想执行 ping 命令并在 PHP 页面上显示结果。我使用的代码是

<?php
$who = shell_exec('whoami');
$result1 = shell_exec("/webserver_commands/ping -c 4 www.google.com");
exec("ping -c 4 www.google.com",$result2);

echo $who;
echo "<br/>".$result1;
echo "<br/>".$result2;
?>

我得到的输出是

apache 

Array

所以我知道脚本正在以用户“apache”的身份运行

在 apache 日志中我看到以下几行

sh: /webserver_commands/ping: Permission denied
ping: icmp open socket: Permission denied

我已确保目录 /webserver_commands/ 及其中的文件 ping 归 apache 组的用户 apache 所有

917506 drwxrwxrwx.   2 apache apache  4096 Feb  4 18:29 webserver_commands
917507 -rwxrwxrwx. 1 apache apache 43448 Feb  4 18:29 ping

知道这里可能出了什么问题吗?

谢谢你,-ankit

答案1

apache用户没有足够的权限发送 ICMP 数据包,请考虑使用网络Ping而不是使用 PEAR 库。如果你使用的是 Debian,可以使用apt-get install php-net-ping

答案2

如果要显示 $result2,则需要将其分解。 exec() 将其输出作为数组放入第二个参数中。因此

打印(implode("<br>",$result2));

或者回声,随您喜好

至于 ping,它无法工作,因为在复制时它丢失了 setuid 位。您需要执行

chown root /webserver_commands/ping
chmod u+s /webserver_commands/ping

答案3

一个可能的原因是,该命令ping在设计上是一个仅限 root 用户的命令,因此,为了从非 root 用户执行该命令,许多发行版在“ping”上设置了 setuid 位;然而,相反,许多发行版没有这样做 - 这可能包括 FC14

如果 ping 没有设置 setuid 位,并且你愿意打开这个潜在的(但不太可能)安全漏洞,您可以chmod u+sping 以允许任何用户执行它。

相关内容