我有此php代码:
echo shell_exec('sh /backups/turnon.sh');
/backups/turnon.sh
代码是:
屏幕-X'CD/FTB;JAVA -XMS2048M -XMX2048M -JAR MCPC.JAR'
但是,该网站输出:
找不到屏幕会话。
但是,如果我打开腻子并且做screen -x
,我可以没有任何问题加载屏幕。我在做什么错。
不确定为什么会这样做,而是作为一种的样本来做。
www-data
解决此情况的一种方法是附加以正确的用户会话。对于通常是 www-data
的apache,它是具有剥离特权的用户。在 apache 上使用 ps
或,
在PHP中,您可以运行此操作以向您显示哪个用户PHP(Apache)运行为:
<?php echo exec('whoami'); ?>
输出:
www-data
请注意,如果您使用命令行中的PHP运行脚本,您将获得当前用户,而您不想要的用户。
启动www-data
的屏幕会话www-data 通常不会使用密码设置,因此我们无法与该用户登录。要运行 www-data 的屏幕会话,可以做以下操作:
$ 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-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
在
.screenrc
中使用logfile
选项,并使用-L
。在屏幕内运行
script -f /tmp/www-data-scr.log
。start www-data 脚本屏幕屏幕会话与log-file,
-f
flush。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
在发出产生一些输出的命令后,在读取日志文件之前。
。总结
作为特权用户:
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
进程运行要附加到。在您的推杆登录环境和脚本试图运行的环境之间有所不同,可能是您的screen
会话作为您的Putty Login用户运行,但在运行脚本的用户时没有运行。