以特定用户身份从PHP运行命令行应用程序

我在本地主机上运行Apache。 从一个以www用户身份运行的PHP脚本,我想在我的机器上控制Rhythmbox播放。 到目前为止,我的PHP脚本中有一个简单的命令:

exec('rhythmbox-client --pause');

这个效果很好,当我从命令行运行它,但如果它作为www用户运行,我想rhythmbox-client不知道/不能访问我的Rhythmbox实例。

是否有一个简单的方法让PHP脚本以我的用户身份运行,而不是由www用户运行,或者告诉rhythmbox-client哪个实例要控制?

总的应用是,当我的电话摘机时,它会调用我的PHP脚本暂停音乐,并在电话挂机时恢复播放。 我爱VoIP电话!

解决方法:感谢Carpetsmoker和Tarek我用sudo作为答案,但是有一些问题。 为了克服它们,我做了以下几点:

创build一个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执行,我的手机可以暂停/播放我的音乐!

一个解决scheme是使用sudo(8)

 exec('sudo -u myuser ls /'); 

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

 wwwuser ALL=/usr/bin/rhythmbox-client 

为了防止Apache能够运行其他命令, 只有 rythymbox命令。

如果一个进程可以由任何用户运行,它可以由PHP运行。 例子是fortune命令

 -rwxr-xr-x 1 root root 18816 Oct 1 2009 /usr/games/fortune 

查看每个用户的x权限。 但是这有时候根本不起作用,您可能不得不让用户( www-dataapache等)运行该程序。 您可以sudo www-data并尝试运行该命令。 如果它工作,那么Apache / PHP应该能够运行它。

就我而言,解决scheme是这样来的:

1)在sudoers文件中join了这几行:

 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