我有这个PHP代码:
echo shell_exec('sh /backups/turnon.sh');
/backups/turnon.sh
代码为:
screen -X'cd / ftb; java -Xms2048m -Xmx2048m -jar mcpc.jar'
然而,该输出到网站:
未找到任何屏幕会话。
但是如果我打开PuTTY并且screen -x
我可以加载屏幕而没有问题。我做错了什么。
答案 0 :(得分:1)
screen
的手册页明确指出:
-x Attach to a not detached screen session. (Multi display mode).
-X Send the specified command to a running screen session.
您收到的错误消息显示没有正在运行的screen
进程正在附加到该进程。您的PuTTY登录环境与尝试运行脚本的环境之间有所不同,可能是您的PuTTY登录用户正在运行screen
会话,但运行脚本的用户没有运行。
答案 1 :(得分:1)
不确定为什么会这样做,但作为单向的样本来做。
解决此案例的一种方法是附加到正确的用户会话。对于通常为 www-data
的Apache,它是具有精简权限的用户。在 apache 或
ps
在PHP中,你可以运行它来向你展示PHP(Apache)运行的用户:
<?php echo exec('whoami'); ?>
输出:
www-data
请注意,如果您从命令行使用PHP运行脚本,您将获得当前用户,这是您不想要的。
www-data 通常没有设置密码,因此我们无法使用该用户登录。要为 www-data 运行屏幕会话,可以执行以下操作:
$ sudo su - www-data
$ script /dev/null
$ screen
或者作为一个单行:
sudo su - www-data -c 'script -c screen /dev/null'
这将在 www-data 的主目录中启动一个新shell,通常为/var/www/
。 脚本命令是一种在使用sudo su
时运行 screen 时防止终端访问错误的方法。
现在我们有 www-data 的屏幕会话,我们可以继续使用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
logfile
中的.screenrc
选项,并使用-L
运行屏幕。script -f /tmp/www-data-scr.log
。使用日志文件-f
启动 www-data 脚本屏幕会话以进行刷新。
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>