Intereting Posts
Отправка входных данных с android на php PHP Sanitize Data Функция preg_match для телефонных номеров Простой кросс-браузер, загрузка файла jQuery / PHP с индикатором выполнения функция переключения между сингулярным и множественным числом? Правильный способ обработки исключений Отправка HTML-письма от php с помощью переменных Как исправить строки с двойным кодированием UTF-8, находящиеся в полях MySQL utf8_general_ci? Система регистрации / регистрации с php и mysql Может ли php cron задавать доступ к переменным сеанса / файлам cookie? Как написать текстовый файл с условием с помощью PHP Валидатор W3C: «Элементная глава не имеет необходимого экземпляра названия дочернего элемента» Недействительный или отсутствующий центр сертификации найден, используя входящую информацию WordPress: отображение сообщения об ошибке – hook admin_notices завершается с ошибкой по wp_insert_post_data или publish_post NGNX + PHP-FPM tmp dir

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

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

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

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

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

 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 должен иметь возможность запускать его.

В моем случае решение получилось так:

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

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

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