我以前问过这个问题,但没有什么收获。我想我当时搞混了,没有正确地提出我的问题。所以又问了一遍。
我开始之前有几点要说:
- 我正在运行 FC 14
- 我没有手动安装 apache...使用 yum
- 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+s
ping 以允许任何用户执行它。