Запуск приложения командной строки из PHP от имени конкретного пользователя - PullRequest
16 голосов
/ 02 августа 2011

Я использую Apache на своем локальном хосте.Из PHP-скрипта, запущенного от имени пользователя www, я хотел бы управлять воспроизведением Rhythmbox на моей машине.Пока у меня есть простая команда в моем PHP-скрипте:

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

Это прекрасно работает, когда я запускаю его из командной строки, как я, но если он запускается как пользователь wwwЯ предполагаю, что rhythmbox-client не знает / не может получить доступ к моему экземпляру Rhythmbox.

Есть ли простой способ для того, чтобы этот PHP-скрипт работал как мой пользователь, а не как www-пользователь, или сказать 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

Теперь этот скрипт bash может быть выполнен с помощью PHP и wwwuser, и мой телефон может приостановить / воспроизвести моймузыка!

Ответы [ 3 ]

21 голосов
/ 02 августа 2011

Одно решение использует sudo(8):

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

Вам, очевидно, потребуется настроить sudo(8), чтобы пользователь, запустивший ваш веб-сервер, мог вызвать его. Редактируя файл sudoers с помощью visudo(8), вы можете использовать что-то вроде:

wwwuser ALL=/usr/bin/rhythmbox-client

Чтобы Apache не мог выполнять другие команды, и только команда rythymbox.

1 голос
/ 29 марта 2015

В моем случае решение пришло следующим образом:

1) Добавлены следующие строки в файл sudoers:

myuser ALL=(ALL) NOPASSWD: /usr/bin/prlctl  
_www ALL=(ALL) NOPASSWD: /usr/bin/prlctl     # IMPORTANT!!!

2) Команда EXEC () в PHP была изменена на:

exec("sudo -u myuser prlctl list -a", $out, $r);

Большое спасибо за вашу помощь!

Виктор Эспина

0 голосов
/ 02 августа 2011

Если процесс может запускаться любым пользователем, он может запускаться PHP.Пример: fortune команда

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

Посмотрите на разрешение x для каждого пользователя.Но иногда это вообще не работает, и вам, возможно, придется позволить пользователю www-data или apache и т. Д. Запустить программу.Вы можете sudo www-data и попытаться запустить команду.Если он работает, Apache / PHP должен его запустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...