You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中获取GNU Screen会话终端文本?求简化实现

解决PHP获取GNU Screen会话终端文本的问题

为什么Copilot的代码返回空字符串?

screen -S <会话名> -X hardcopy -h不会直接输出内容到标准输出,它默认会把当前窗口的终端内容写入到会话目录下的hardcopy.0文件(窗口号为0时),因此shell_exec捕获不到任何输出,自然返回空。

简便可靠的实现方法

方法1:利用hardcopy输出到标准输出

部分GNU Screen版本支持将hardcopy的输出目标指定为-(代表标准输出),可直接捕获内容:

function getTerminalTextFromGnuScreen(string $screenName): string
{
    // 使用hardcopy将内容输出到stdout,-h参数包含历史缓冲区内容
    $cmd = sprintf('screen -S %s -X hardcopy -h -', escapeshellarg($screenName));
    $output = shell_exec($cmd);
    return $output !== false ? trim($output) : '';
}

如果你的Screen版本不支持-作为输出文件,可通过临时文件中转:

function getTerminalTextFromGnuScreen(string $screenName): string
{
    $tmpFile = tempnam(sys_get_temp_dir(), 'screen_hardcopy');
    if ($tmpFile === false) {
        return '';
    }

    try {
        $cmd = sprintf('screen -S %s -X hardcopy -h %s', escapeshellarg($screenName), escapeshellarg($tmpFile));
        shell_exec($cmd);
        
        $content = file_get_contents($tmpFile);
        return $content !== false ? trim($content) : '';
    } finally {
        // 清理临时文件
        unlink($tmpFile);
    }
}

方法2:使用dumpbuf命令

若仅需当前缓冲区内容(无需历史),可直接用dumpbuf输出到标准输出:

function getTerminalTextFromGnuScreen(string $screenName): string
{
    $cmd = sprintf('screen -S %s -X dumpbuf -', escapeshellarg($screenName));
    $output = shell_exec($cmd);
    return $output !== false ? trim($output) : '';
}

关键注意事项

  • 确保执行PHP的用户对目标Screen会话有访问权限(会话属于同一用户,或谨慎使用sudo提升权限)。
  • 默认操作编号为0的窗口,如需指定其他窗口,可添加-p <窗口编号>参数,例如screen -S <会话名> -p 1 -X hardcopy ...。
  • 上述方法无需手动处理终端控制字符,hardcopy和dumpbuf会自动过滤ANSI控制序列,输出纯文本内容。

内容的提问来源于stack exchange,提问作者hanshenrik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:21:01