以特定用户身份从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-data
或apache
等)运行该程序。 您可以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