如何在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
相关产品推荐
相关产品推荐

