即使_www具有root权限,php exec也会失败

时间:2013-08-01 00:04:02

标签: php macos apache exec root

我想通过php exec命令打开存储在MAC OS X 10.8服务器上的文本文件。 为此,我首先创建了一个名为dummy.txt的虚拟文本文件,里面有一些文本。 然后我创建了一个名为script.sh的脚本文件,包括以下内容:

open -a /Applications/TextEdit.app /Library/WebServer/Documents/Secured/upload/dummy.txt

然后创建了一个包含以下内容的测试php文件:

exec('/Library/WebServer/Documents/Secured/upload/script.sh');

Mac上的Apache用户“_www”被授予_www和group to wheel所有文件的所有权 dummy.txt和test.php的权限是644,而script.sh文件的权限是755。

以标准用户身份登录,从终端运行script.sh显示TextEdit程序打开dummy.txt文件。

以root身份登录,再次尝试标准用户,如下所示:

su - myuser -c "/Library/WebServer/Documents/Secured/upload/script.sh"

将正常显示编辑器。然而;

su - _www -c "/Library/WebServer/Documents/Secured/upload/script.sh"

无法运行文本编辑器。

当我通过客户端机器浏览器访问test.php时,它也没有显示文本编辑器。

但是,通过客户端计算机访问在apache错误日志中显示以下错误:

LSOpenURLsWithRole() failed with error -10810 for the file /Library/WebServer/Documents/Secured/upload/dummy.txt

使用ALL权限将_www添加到sudoers文件(如下所示)并没有解决我的问题。

_www    ALL=(ALL) NOPASSWD: ALL

我甚至尝试将以下行添加到sudoers中:

Defaults:_www !requiretty

并在passwd文件中将_www user的shell从false设置为sh。

他们都没有奏效。我还要补充一点,在这一点上,安全性不是我的关注点。我只是想成功运行它。然后我会处理安全隐患。

有什么建议吗? 提前致谢

1 个答案:

答案 0 :(得分:0)

open命令(以及打开TextEdit的任何其他方式)仅适用于GUI会话的上下文; Web服务器不是您的会话的一部分,因此它无法在您的会话中打开某些内容。

有很多方法可以解决这个问题,但他们确实非常难看。它们涉及从_www用户切换到root(可能带有sudo),附加到GUI会话中运行的某个进程的上下文(launchctl bsexec somePID somecommand),然后可能还需要切换到会话所有者( sudo -u loggedinuser),然后运行open命令。

这很难看,因为你想要做的事情真的很不自然。在Web服务器中有一些东西触发GUI编辑会话实际上没有任何意义。请重新考虑您尝试做什么以及为什么。