我想通过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。
他们都没有奏效。我还要补充一点,在这一点上,安全性不是我的关注点。我只是想成功运行它。然后我会处理安全隐患。
有什么建议吗? 提前致谢
答案 0 :(得分:0)
open
命令(以及打开TextEdit的任何其他方式)仅适用于GUI会话的上下文; Web服务器不是您的会话的一部分,因此它无法在您的会话中打开某些内容。
有很多方法可以解决这个问题,但他们确实非常难看。它们涉及从_www用户切换到root(可能带有sudo
),附加到GUI会话中运行的某个进程的上下文(launchctl bsexec somePID somecommand
),然后可能还需要切换到会话所有者( sudo -u loggedinuser
),然后运行open命令。
这很难看,因为你想要做的事情真的很不自然。在Web服务器中有一些东西触发GUI编辑会话实际上没有任何意义。请重新考虑您尝试做什么以及为什么。