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

2022-08-30 22:13:59

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

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

当我以我的身份从命令行运行它时,这很有效,但是如果它以www-user身份运行,我想不知道/无法访问我的Rhythmbox实例。rhythmbox-client

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

整个应用程序是,当我的手机脱钩时,它会调用我的PHP脚本,该脚本会暂停音乐,并在手机上钩时恢复播放。我喜欢VoIP电话!

溶液:感谢Carpetsmoker和Tarek,我用了作为答案,但有几个问题。为了克服它们,我做了以下工作:sudo

创建了一个 bash 脚本来调用 。这个bash脚本是在PHP中使用的,如下面的答案中所述。不幸的是,不知道要控制什么环境,所以bash脚本看起来像这样:rhythmbox-clientsudorhythmbox-client

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


答案 1

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

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

显然,您需要设置以允许运行Web服务器的用户调用它。使用 编辑 sudoers 文件,您可以使用如下内容:sudo(8)visudo(8)

wwwuser ALL=/usr/bin/rhythmbox-client

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


答案 2

在我的情况下,解决方案是这样的:

  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);


推荐