从伪终端(pts)捕获终端内容?

从伪终端(pts)捕获终端内容?

在 Ubuntu 上,有没有办法捕获内容伪终端(pts - 例如 /dev/pts/4) - 即将终端中的文本行转储到文件中 - 程序的已经运行在那个终端里?我说的不是截屏,而是将程序写入终端的内容存储到文件中。这是基于 curses 的程序定期重写屏幕。

我的主要问题是我的程序是已经运行- 我想保存这个停止(或许重新启动)该程序。

我知道有几种方法可以实现这一点,我曾考虑过这种可能性我启动了该程序:简单地将输出重定向到文件;使用screen,并获取硬拷贝或记录会话;使用虚拟终端(/dev/tty ..)并使用视频控制台内存设备(/dev/vcs ..);使用命令script......(可能还有许多其他命令......)

但所有这一切,只有在我开始这个程序之前完成才会有效!

那么,我还有办法“窥探”伪终端并记录其内容吗?如果需要,我可以成为 root 用户……

答案1

也许不是直接从 tty,但此进程必须使用write系统调用。您可以使用它strace来捕获所有写入调用。

sudo strace -e t=write -s 6000 -p your-process-id 2>logfile

您将获得类似这样的内容,可能需要更多解析:

write(1, "191\n", 4)                    = 4
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=9916, si_uid=1001, si_status=0, si_utime=0, si_stime=0} ---
write(1, "21021\n", 6)                  = 6
write(1, "14728\n", 6)                  = 6
write(1, "13291\n", 6)                  = 6
write(1, "20372\n", 6)                  = 6

如果您的程序写入其他文件,您也会在输出中看到这些内容。这可能很烦人。或者最终可能会产生大量数据。使用的文件描述符可能是 1。您可以 grep "^write.1"

sudo strace -e t=write -s 6000 -p your-process-id 2>&1 | grep ^write.1 >logfile

下次,尝试使用 运行命令script。它会捕获写入 tty 的所有数据。

script -c "program and args" logfile

相关内容