从PHP运行命令行应用程序作为特定用户

Tak*_*Tak 16 php exec

我在我的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脚本是sudo在PHP 中执行的,如下面的答案中所述.不幸的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
Run Code Online (Sandbox Code Playgroud)

现在bash脚本可以由PHP和wwwuser执行,我的手机可以暂停/播放我的音乐!

Mar*_*oij 21

一种解决方案是使用sudo(8):

exec('sudo -u myuser ls /');
Run Code Online (Sandbox Code Playgroud)

显然,您需要设置sudo(8)允许运行Web服务器的用户调用它.编辑sudoers文件visudo(8),你可以使用类似的东西:

wwwuser ALL=/usr/bin/rhythmbox-client
Run Code Online (Sandbox Code Playgroud)

防止Apache能够运行其他命令,只能运行rythymbox命令.