1

У меня есть PHP-код, который выглядит следующим образом (kill.php):

<?php echo exec("/home/duke/aa/scripts/test.sh");  ?>

test.sh выглядит так:

screen -S server -X quit

Если я запускаю код php на экране терминала php screen -S server -X quit выход, сценарий убивает сеанс экрана.

Однако, если я указываю моему веб-браузеру на http://mywebsite/test.php, он отображает "Нет экранных сеансов" и не прерывает сеанс экрана. Что я могу сделать, чтобы он работал через веб-браузер?

2 ответа2

1

Конфигурация по умолчанию - запускать все страницы PHP (и их порожденные команды) как пользователь www-data , что означает, что они имеют доступ только к сеансам, принадлежащим www-data.

Вам нужно запустить скрипт под своей учетной записью, что можно сделать:

  • используя sudo ; например, следующая запись sudoers:

    www-data: ALL=(duke) NOPASSWD: /home/duke/aa/scripts/test.sh
    

    позволит вам запустить exec("sudo -u duke /home/duke/aa/scripts/test.sh");

  • или установка suPHP: скрипт PHP будет запущен под учетной записью его владельца.


Ваш текущий пример запускает скрипт дважды, что может иметь различные побочные эффекты. Избавьтесь от второго вызова exec() - или, что еще лучше, используйте system() или passthru() - если вы хотите отобразить вывод скрипта.

1

Я предполагаю, что причина в том, что вы запускаете сеанс экрана как другой пользователь, а не как пользователь вашего веб-сервера (возможно, www-data), но, поскольку скрипт будет запускаться как пользователь вашего веб-сервера при запуске через браузер, он не имеет права отправлять команды на сеанс экрана другого пользователя.

Как это исправить, зависит от того, как вы изначально начали сеанс экрана. Если возможно запустить его как пользователь веб-сервера, это будет самое простое решение, но другие варианты могут включать sudo или более сложные меры (*). Расскажите нам больше о том, что вы делаете, чтобы мы могли внести полезные предложения.

(*) Я видел "решение" для такого рода проблем, когда PHP-скрипт записывал специальный файл, который был обнаружен cronjob, который начал свою работу только при его наличии ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .