是否可以读取屏幕上的字符(准确地说:在屏幕会话中,来自带有 ncurses 界面的旧软件)?
不幸的是,我们在屏幕会话中运行的软件的(非常简单的)API 不允许访问一些仅“在屏幕上”显示的重要状态消息。
所以,问题是:我们可以访问屏幕会话的“字符缓冲区”从外面? 例如某事 => getChars(x=5, y=30, length=5; screen-pid=12345)
?
答案1
一般而言,屏幕缓冲区是终端仿真器的属性(不是 'tty' 本身的一部分)。有些终端仿真器允许从外部访问其屏幕缓冲区,有些则不允许。
GNU Screen 使用命令支持此:hardcopy
功能(尽管在我的快速测试中,它完全地破坏了所有非 ASCII 文本(这些文本应该是 UTF-8)。用于screen -X
从外部调用它:
screen -X hardcopy /tmp/foo
tmux 中的等效功能(使用capture-pane
和save-buffer
)似乎效果更好:
tmux capture-pane -t <id> \; save-buffer /tmp/foo \; delete-buffer
(为了完整性:Linux 虚拟控制台也允许这样做,使用窥视。
有时你可能会发现使用终端仿真库编写自定义“主机”程序更有用(例如库) – 创建一个 pty,运行附加到它的软件,然后使用 libvterm 将 ncurses“绘图”序列直接处理到您自己的缓冲区中。