屏幕-X无效(“未找到屏幕”)

时间:2014-03-08 00:19:50

标签: php bash

我有这个PHP代码:

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

/backups/turnon.sh代码为:

  

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

然而,该输出到网站:

  

未找到任何屏幕会话。

但是如果我打开PuTTY并且screen -x我可以加载屏幕而没有问题。我做错了什么。

2 个答案:

答案 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的数据

解决此案例的一种方法是附加到正确的用户会话。对于通常为 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 的主目录中启动一个新shell,通常为/var/www/脚本命令是一种在使用sudo su时运行 screen 时防止终端访问错误的方法。


从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
  • 使用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>