【问题标题】:Screen -X isn't working ("No screen found")屏幕 -X 不工作(“未找到屏幕”)
【发布时间】:2014-04-11 08:59:08
【问题描述】:

我有这个 php 代码:

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

/backups/turnon.sh 代码是:

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

但是,输出到网站:

未找到屏幕会话。

但是,如果我打开 PuTTY 并执行 screen -x,我可以毫无问题地加载屏幕。我做错了什么。

【问题讨论】:

  • 推测 PHP 代码正在由 Apache 运行,而 screen 作为您的登录帐户运行(即,不是 apache)。
  • 嗯,有没有办法强制它以 root 身份运行?或者让屏幕在任何帐户上工作?一次只有一个在运行。
  • 您可以使用 sudo 或将 setuid 位放在您的 .sh 上,但这在安全方面可能是个坏主意。
  • 没关系,bash文件的重点是任何人都可以运行(单击按钮时它会执行它,这是为了确保人们可以将服务器备份)。感谢您的想法!
  • 就像@FlorentBayle 说的,开始屏幕就像sudo -u apache screen ?

标签: php bash


【解决方案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 登录环境和脚本尝试运行的环境之间有些不同,可能是您有一个 screen 会话作为您的 PuTTY 登录用户运行,但没有一个会话作为运行脚本的用户运行。

【讨论】:

    【解决方案2】:

    不确定为什么要这样做,但作为一种方法的示例。


    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/script 命令是防止在运行 screen 时由于使用sudo su 而导致终端访问错误的一种方法。


    从 PHP 执行脚本

    现在我们有了 www-datascreen 会话,我们可以继续使用 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 运行screen

    • 在屏幕内运行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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多