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

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

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

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

Есть ли простой способ для этого PHP script запускаться как мой пользователь, а не www-user, или сообщить rhythmbox-client, какой экземпляр для управления?

В общем случае, когда мой телефон отключается, он вызывает мой PHP script, который приостанавливает музыку и возобновляет воспроизведение, когда телефон подключен. Я люблю телефоны VoIP!

Решение: Благодаря Carpetsmoker и Tarek я использовал sudo в качестве ответа, но возникла пара проблем. Чтобы преодолеть их, я сделал следующее:

Создал bash script для вызова rhythmbox-client. Этот bash script был выполнен с использованием sudo в PHP, как описано в ответе ниже. К сожалению, rhythmbox-client не знал, какую среду контролировать, поэтому bash script выглядит следующим образом:

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

Ответы

Ответ 1

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

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

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

wwwuser ALL=/usr/bin/rhythmbox-client

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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