Intereting Posts
Laravel 4 красноречивый опорный стол Регулярное выражение не выводит все возможные совпадения в PHP Получение всех узлов с тем же именем с использованием xpath для XML-файла BMECAT? cURL как прокси, обрабатывать метод HTTPS / CONNECT Вернуться на предыдущую страницу с заголовком («Местоположение:»); в PHP Пользовательская конечная точка WooCommerce API v3 SQLSTATE Доступ запрещен для пользователя «имя пользователя» @ «localhost» с использованием CakePhp Хотите показать «загрузку» изображения во время загрузки страницы – Javascript Вычтите одну секунду из заданного времени Форма SF2: ошибка Ни свойство … ни один из методов «получить Простая замена шаблона var, но с завихрением Ошибка отображения на php Класс сеанса PHP Использование curl в php с «сертификатом CA, сертификатом клиента и приватным ключом» в отдельных файлах Как устранить / получить ответ об ошибке при запуске недопустимых заданий BigQuery?

Экран -X не работает («Нет экрана»)

У меня есть этот код php:

echo shell_exec('sh /backups/turnon.sh'); 

Код /backups/turnon.sh :

screen -X 'cd / ftb; java -Xms2048m -Xmx2048m -jar mcpc.jar '

Тем не менее, эта информация выводится на веб-сайт:

Нет сеанса сеанса связи.

Однако, если я открываю PuTTY, и я делаю screen -x я могу загрузить экран без проблем. Что я делаю не так.

Не уверен, зачем это делать, но как образец одного из способов сделать это.


WWW-данные

Один из способов решения этого дела – присоединить к правильному сеансу пользователя. Для Apache, который обычно является www-data который является пользователем с ограниченными привилегиями. Используйте ps для apache или,

в PHP вы можете запустить это, чтобы показать, какой пользователь PHP (Apache) работает как:

 <?php echo exec('whoami'); ?> 

Вывод:

 www-data 

Обратите внимание: если вы запустите скрипт с помощью PHP из командной строки, вы получите текущего пользователя, которого вы не хотите.


Инициировать сеанс экрана для www-данных

www-data обычно не настроен с паролем, поэтому мы не можем войти в систему с этим пользователем. Чтобы запустить сеанс сеанса для www-данных, вы можете сделать следующее:

 $ sudo su - www-data $ script /dev/null $ screen 

Или как однострочный:

 sudo su - www-data -c 'script -c screen /dev/null' 

Это запустит новую оболочку в домашнем каталоге www-data , обычно /var/www/ . Команда сценария является одним из способов предотвратить ошибку доступа к терминалу при запуске экрана из-за использования sudo su .


Выполнить скрипт из PHP

Теперь, когда у нас есть сеанс экрана для www-данных, мы можем продолжить с помощью сценария Bash.

 /usr/bin/screen -X stuff '/usr/bin/java -cp /some/path/ Test ' 

и выполнить его с PHP.


Захват вывода

Если вы хотите, чтобы буфер с экрана в PHP был различным:

Сначала создайте файл журнала для сеанса экрана www-data .

 touch /tmp/www-data-scr.log chown www-data:www-data /tmp/www-data-scr.log 
  • Используйте параметр .screenrc в .screenrc и запустите экран с -L .
  • Запустите script -f /tmp/www-data-scr.log внутри экрана.
  • Запустите сеанс сеанса сценария www-data с лог-файлом, -f для очистки.

     sudo su - www-data -c 'script -fc screen /tmp/www-data-scr.log' 
  • Скопируйте буфер в файл, чтобы получить моментальный снимок.

     /usr/bin/screen -X hardcopy /tmp/www-data-scr.log 
  • и т.п.

Обычно вы добавляете

 sleep N 

в вашем скрипте bash после выдачи команды, производящей некоторый вывод и перед чтением файла журнала.


Подводить итоги

Как привилегированный пользователь:

 touch /tmp/screen.log sudo chown www-data:www-data /tmp/screen.log sudo su - www-data -c 'script -c screen /dev/null' 

Сценарий Bash:

 #!/bin/bash /usr/bin/screen -X stuff 'java -cp /some/class/path/ Test ' sleep 1 /usr/bin/screen -X hardcopy /tmp/screen.log sed '/^$/d' /tmp/screen.log 

PHP:

 <pre> <?php echo "-----------------------------------------------------------\n"; echo htmlentities(shell_exec('sh /path/to/script')); echo "-----------------------------------------------------------\n"; ?> </pre> 

На странице руководства для screen указано следующее:

 -x Attach to a not detached screen session. (Multi display mode). -X Send the specified command to a running screen session. 

Сообщение об ошибке, которое вы получаете, говорит о том, что для подключения к существующему screen не существует. Что-то другое между вашей логистической средой PuTTY и средой, в которой пытается запустить скрипт, возможно, что у вас сеанс screen работает как пользователь входа в PuTTY, но никто не работает как пользователь, выполняющий скрипт.