У меня есть этот код php:
echo shell_exec('sh /backups/turnon.sh');
Код /backups/turnon.sh
:
screen -X 'cd / ftb; java -Xms2048m -Xmx2048m -jar mcpc.jar '
Тем не менее, эта информация выводится на веб-сайт:
Нет сеанса сеанса связи.
Однако, если я открываю PuTTY, и я делаю screen -x
я могу загрузить экран без проблем. Что я делаю не так.
Не уверен, зачем это делать, но как образец одного из способов сделать это.
Один из способов решения этого дела – присоединить к правильному сеансу пользователя. Для Apache, который обычно является www-data
который является пользователем с ограниченными привилегиями. Используйте ps
для apache или,
в PHP вы можете запустить это, чтобы показать, какой пользователь PHP (Apache) работает как:
<?php echo exec('whoami'); ?>
Вывод:
www-data
Обратите внимание: если вы запустите скрипт с помощью PHP из командной строки, вы получите текущего пользователя, которого вы не хотите.
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
.
Теперь, когда у нас есть сеанс экрана для 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, но никто не работает как пользователь, выполняющий скрипт.