PHP exec() 命令权限被拒绝。

4

我有一个C++可执行文件' skypeforwarder'。如果我在Mac终端中使用命令行,skypeforwarder可以正常工作: henry $ /Users/henry/Desktop/skypeForwarder/skypekit-sdk_sdk-4.1.2.20_793394/examples/cpp/tutorial/step3/skypeForwarder

sh: /Users/henry/Desktop/skypeForwarder/skypekit-sdk_sdk-4.1.2.20_793394/examples/cpp/tutorial/step3/skypeForwarder: Permission denied

但是如果在php exec()中调用它,它总是会发出“权限被拒绝”的错误。

<?php 
echo exec('whoami');

$output = null;

$execBuild = '/Users/henry/Desktop/skypeForwarder/skypekit-sdk_sdk-4.1.2.20_793394/examples/cpp/tutorial/step3/';
$execBuild .= 'skypeForwarder';

$n  = exec($execBuild, $output); 

我进行了大量的搜索,问题应该是Web服务器中php/浏览权限的问题。我还尝试将文件的所有者更改为:
-rwxr-xr-x  1 henry  staff  1212716 19 Apr 11:23 skypeForwarder

to

-rwxr-xr-x  1 _www  staff  1212716 19 Apr 11:23 skypeForwarder

它仍然不能工作。

我根据http://foundationphp.com/tutorials/php_leopard.php在我的Mac上设置了Apache。


1
执行 exec("whoami"); 的输出是什么? - SSH This
2个回答

6
虽然文件本身可以被Web服务器读取,但是Desktop文件夹很可能不行,因此Web服务器无法进入其中查找可执行文件。您应将skypeforwarder二进制文件移动到Web服务器可读取的位置,例如与您尝试提供此PHP脚本的位置平行的目录中。该目录不应该是Web可访问的。请使用.htaccess进行保护或将其放置在Web根目录之上,但它必须能够被Web服务器读取。

默认情况下,OSX上的Desktop-rwxr------,不建议更改该目录的权限。

此外,强烈不建议更改文件的所有者和可写性为_www Web服务器用户。相反,它应该可被Web服务器读取和执行,但不能被写入。

chown henry skypeforwarder
chmod 755 skypeforwarder

标准免责声明:一如既往地,在从可访问Web的PHP脚本中执行系统调用时要非常谨慎。


这可能是因为某人情绪不好而恶意攻击。我已经给你点赞了。 - Ryan
1
现在它可以工作了。权限被拒绝,因为尽管我已经将 _www skypeforwarder chown,但 henry 仍然是 /Users/henry/Desktop/skypeForwarder/ 目录的所有者。一位同事帮助我用两个步骤解决了这个问题。1. vi /private/etc/sudoers,添加一行:_www ALL=(ALL) NOPASSWD: ALL 2. chown _www:staff /Users/henry/Desktop/skypeForwarder/。谢谢 Michael,你的许多建议对我很有帮助。我知道将目录设置在 /Users/henry/Desktop/ 下不是一个好方法。我会改变它。 - droughtrain

0

请尝试查看php.ini中的disable函数。

disable_functions = exec

我在我的 /private/etc/php.ini 中搜索了一下,没有找到 disable_functions 列表。谢谢。 - droughtrain
我从你在另一篇帖子中的评论中看到exec("whoami")的输出是_www,这意味着该函数已被允许,因此不是我建议的问题。如果它被禁用,你将在apache/PHP错误日志中得到一个错误。 - PadraigD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接