我是Linux的新手,所以我觉得这个答案很简单,但是在寻找答案几天后,我就放弃了并指望您的帮助...
我正在CentOS 7上使用软件。当我在TTY伪终端(例如/ dev / tty2)上启动它时,它会在屏幕上打印出许多我需要分析的有趣信息。由于信息量大,为了进行归档,我想将它们保存在文件中。因此很明显,我尝试将stdout,stderr重定向到文件,但事实证明,我只能保存终端屏幕上可见的信息的一小部分(几百行)。稍后我使用strace找出应用程序在屏幕上打印这些信息的方式-它正在写入/ dev / tty0设备(不是/ dev / tty,而是/ dev / tty0,当前可见的控制台,这使-我认为-一个巨大差距)。意识到这一点,我尝试了许多可能的解决方案来捕获此输出,包括:
对于捕获/ dev / tty的写入来说,这一切都很好,但是对于/ dev / tty0来说却不行!
您能提出任何解决方案,甚至只是我可以尝试的想法吗?
答案 0 :(得分:0)
对于那些可能感兴趣的人...经过几个星期的实验,我分享了我学到的东西:
强制预加载方法-一种简便,快速的方法,但对于我来说主要缺点是-它实际上不会拦截syscall,而是libc标准库调用。缺点是,应用程序可以绕过库直接调用syscall,因此不会被拦截。以我为例。
稍后我尝试了内核模块,我可以通过修改syscall_table中的syscall函数地址来相对较快地创建基本的模块,以拦截syscall(需要一些肮脏的技巧,例如使用CR0寄存器操作来保护对该内存的写保护,等等。 。),但是我尝试了更多,但我遇到了更多的问题,尤其是在派生子进程的拦截过程的背景下,我也想拦截派生进程的syscall。当然,最大的好处是您可以完全访问任何内核结构,等等。一段时间后,我放弃了尝试第三种选择。
Ptrace方法-乍一看看起来很复杂,但是很合逻辑,但是您需要阅读冗长的人才能理解。再次,对于分叉的过程来说,事情变得复杂了,但是我现在要创建可行的解决方案了,像PTRACE_O_TRACEFORK之类的东西很有帮助。
我的结论-为此创建通用解决方案并不是一件容易的事(例如查看'strace'源代码...),对我来说ptrace是最好的选择,但是您需要花费一些时间来理解它,尤其是对于分叉过程。
结论号。 2-试图解决这个问题,这对我来说是一次极大的冒险,深入Linux内核以及syscall的工作方式是一件了不起的学习:)
谢谢您的灵感! :)