0

我想通过 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 的所有文件的所有权,并且 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

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

_www    ALL=(ALL) NOPASSWD: ALL

我什至尝试在 sudoers 中添加以下行:

Defaults:_www !requiretty

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

他们都没有工作。我还应该补充一点,在这一点上,安全不是我关心的问题。我只想成功运行它。然后我会处理安全隐患。

有什么建议么 ?提前致谢

4

1 回答 1

0

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

有办法解决这个问题,但它们真的很丑。它们涉及从 _www 用户切换到 root(可能使用sudo),附加到在 GUI 会话中运行的某个进程的上下文(launchctl bsexec somePID somecommand),然后可能还必须切换到会话所有者(sudo -u loggedinuser),然后运行 ​​open 命令。

这很丑陋,因为您尝试做的事情确实不自然。让 Web 服务器中的某些内容触发 GUI 编辑会话真的没有任何意义。请重新考虑您要做什么以及为什么。

于 2013-08-01T05:49:31.440 回答