it-swarm.com.ru

Запуск приложения командной строки из PHP как конкретный пользователь

Я использую 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, и мой телефон может приостановить/воспроизвести мою музыку!

16
Tak

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

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

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

wwwuser ALL=/usr/bin/rhythmbox-client

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

20
Martin Tournoij

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

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

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

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

1
VictorEspina

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

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

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

0
Kumar