我使用 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 想要完成什么,但我很确定那是错误的方法。