我在我的localhost上运行Apache。从作为www-user运行的PHP脚本我想在我的机器上控制Rhythmbox播放。到目前为止,我的PHP脚本中有一个简单的命令:
exec('rhythmbox-client --pause');
当我从命令行运行它时,这很有效,但如果它以www-user运行,我猜rhythmbox-client
不知道/无法访问我的Rhythmbox实例。
是否有一种简单的方法可以让PHP脚本作为我的用户而不是www-user运行,或告诉rhythmbox-client
要控制哪个实例?
整个应用程序是当我的手机摘机时它调用我的PHP脚本暂停音乐,并在手机挂机时恢复播放。我喜欢VoIP电话!
解决方案:
感谢Carpetsmoker和Tarek,我使用sudo
作为答案,但有一些问题。为了克服它们,我做了以下几点:
创建了一个bash脚本来调用rhythmbox-client
。这个bash脚本是在PHP中使用sudo
执行的,如下面的答案所述。不幸的是rhythmbox-client
不知道要控制什么环境,所以bash脚本看起来像这样:
#! /bin/bash
DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1`
if [ "x$DBUS_ADDRESS" != "x" ]; then
export $DBUS_ADDRESS
/usr/bin/rhythmbox-client --pause
fi
既然bash脚本可以由PHP和wwwuser执行,我的手机可以暂停/播放我的音乐!
答案 0 :(得分:21)
一种解决方案是使用sudo(8)
:
exec('sudo -u myuser ls /');
显然,您需要设置sudo(8)
以允许运行您的网络服务器的用户调用它。使用visudo(8)
编辑sudoers文件,您可以使用以下内容:
wwwuser ALL=/usr/bin/rhythmbox-client
防止Apache能够运行其他命令而仅 rythymbox命令。
答案 1 :(得分:1)
就我而言,解决方案就是这样:
1)将这些行添加到sudoers文件中:
myuser ALL=(ALL) NOPASSWD: /usr/bin/prlctl
_www ALL=(ALL) NOPASSWD: /usr/bin/prlctl # IMPORTANT!!!
2)PHP中的EXEC()命令已更改为:
exec("sudo -u myuser prlctl list -a", $out, $r);
非常感谢你的帮助!
Victor Espina
答案 2 :(得分:0)
如果任何用户都可以运行某个进程,那么它可以由PHP运行。示例是fortune
命令
-rwxr-xr-x 1 root root 18816 Oct 1 2009 /usr/games/fortune
查看每个用户的x
权限。但有时这根本不起作用,您可能必须让用户www-data
或apache
等运行该程序。您可以sudo www-data
并尝试运行该命令。如果它工作,那么Apache / PHP应该能够运行它。