Launchd 在启动时不会授予 apache(XAMPP)所有权限

Launchd 在启动时不会授予 apache(XAMPP)所有权限

我使用 Mac OS X,并使用 Launchd 自动启动 XAMPP。我在 httpd.conf 中将 apache 用户设置为与我的帐户名相同

用户 cwd
群组 无群组

好吧,如果我让计算机启动,并使用这些命令运行 php 脚本,那么我会得到以下结果:

echo exec('whoami'); //cwd
exec('echo 1234 | pbcopy');
echo exec('pbpaste'); // (无)

但是,如果我停止 XAMPP 并重新启动它(使用 XAMPP 控制),那么它就会按预期工作,第三行的结果是 1234。

echo exec('pbpaste'); // 1234

exec我在使用或shell_exec之类的运行其他系统命令时也有类似的经历ssh。它们似乎不起作用,直到我手动重新启动 apache。有人对此有什么想法吗?

这是我的启动配置文件:

/Library/LaunchDaemons/xampp.sql.startapache.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist 版本="1.0">
<字典>
<key>启用交易</key>
<真/>
<key>标签</key>
<string>xampp.startapache.mysql</string>
<键> ProgramArguments </键>
<数组>
<string>/应用程序/XAMPP/xamppfiles/xampp</string>
<string>启动mysql</string>
</数组>
<键> RunAtLoad </键>
<真/>
<key>工作目录</key>
<string>/应用程序/XAMPP/xamppfiles</string>
<键> KeepAlive </键>
<false/>
<key>放弃进程组</key>
<真/>
</字典>
</plist>

答案1

这不是特权问题,而是因为 pbcopy 和 pbpaste 需要一个剪贴板服务器(本质上是一个保存剪贴板的后台程序),并且作为用户登录会话的一部分运行。launchd 在系统上下文中运行 apache,因此没有可用的剪贴板服务器(请注意,即使 apache 将用户切换到 cwd,这也与加入您的登录会话不同)。

可能有一种方法可以加入特定的登录会话(涉及launchctl bsexec),但对于 Web 服务来说,这不是一个好主意。首先,因为在您登录之前它无法加入,而一旦您注销就会中断;Web 服务确实应该独立于当时登录的用户运行。其次,因为这意味着您的 php 脚本与您的用户会话共享一个剪贴板 - 您会将某些内容从一个程序复制到另一个程序,然后发现您粘贴的是 Web 脚本中的内容,而不是您复制的内容。同样的事情也可能发生在脚本上 - 它 pbcopies 某些内容,然后 pbpaste 回完全不同的东西,因为您碰巧使用了 GUI 中的复制。如果脚本的多个副本正在运行,它们可能会互相干扰......那将是一团糟。我不确定您使用 pbcopy 和 pbpaste 想要完成什么,但我很确定那是错误的方法。

相关内容