捕获 /dev/tty0 输出到文件

Capturing /dev/tty0 output to file

我是 Linux 的新手,所以我直觉认为答案微不足道,但在寻找答案几天后我放弃了,并指望你的帮助.. .

我在 CentOS 7 上使用软件。当我在 TTY 伪终端(例如 /dev/tty2)上启动它时,它会在屏幕上打印出很多我需要分析的有趣信息。由于信息量大和存档,我想将它们保存在一个文件中。所以很明显我试图将 stdout、stderr 重定向到一个文件,但事实证明我只能保存终端屏幕上可见信息的一小部分(数百行)。我后来使用 strace 来弄清楚应用程序在屏幕上打印这些信息的方式 - 它正在写入 /dev/tty0 设备(不是 /dev/tty,而是 /dev/tty0,当前可见的控制台,这使得 - 我想想 - 一个很大的不同)。意识到这一点,我尝试了许多可能的解决方案来捕获此输出,包括:

对于捕获 /dev/tty 写入来说一切都很好,但对于 /dev/tty0!

就不行了

你能提出任何解决方案,甚至只是一个我可以尝试的想法吗?

对于那些可能感兴趣的人......经过几周的试验,我分享我学到的东西:

  1. 强制预加载方法 - 一种简单快捷的方法,但在我的案例中有一个主要缺点 - 它实际上不拦截系统调用,而是拦截 libc 标准库调用。缺点,因为应用程序可以绕过库直接调用系统调用,并且不会被拦截。它发生在我身上。

  2. 稍后我尝试了内核模块,相对较快地我可以通过修改 syscall_table 中的系统调用函数地址来创建具有拦截系统调用的基本模块(需要一些肮脏的技巧,比如取消保护写入该内存与 CR0 寄存器操作等...),但更多我试图取得进展我遇到了更多问题,特别是在拦截进程的上下文中,它是分叉子进程,我也想拦截分叉进程的系统调用。当然最大的好处是你可以最终访问任何内核结构等......一段时间后我放弃并尝试了第三种选择。

  3. Ptrace 方法 - 乍一看很复杂,但很有逻辑性,但需要阅读长篇大论才能理解。再次对于分叉进程,事情变得复杂,但我现在接近创建可行的解决方案,PTRACE_O_TRACEFORK 等东西有很大帮助。

我的结论 - 为此创建通用解决方案无论如何都不是一件容易的事情(例如查看 'strace' 源代码......),对我来说 ptrace 是最好的选择,但是你需要投资一些时间来理解它,特别是对于 forking 进程。

结论号。 2 - 试图解决这个问题对我来说是一次伟大的冒险,深入研究 linux 内核以及系统调用的工作原理是一次了不起的学习:)

感谢 melpomene 的启发! :)