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

时间:2011-08-02 14:07:17

标签: 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脚本是在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执行,我的手机可以暂停/播放我的音乐!

3 个答案:

答案 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-dataapache等运行该程序。您可以sudo www-data并尝试运行该命令。如果它工作,那么Apache / PHP应该能够运行它。