【发布时间】:2018-08-27 09:46:59
【问题描述】:
我是 Linux 的新手,所以我有直觉认为答案是微不足道的,但在寻找答案几天后,我放弃并指望你的帮助......
我在 CentOS 7 上使用软件。当我在 TTY 伪终端(例如 /dev/tty2)上启动它时,它会在屏幕上打印出很多我需要分析的有趣信息。由于信息量和存档我想将它们保存在一个文件中。所以很明显我试图将stdout、stderr重定向到一个文件,但结果我只能保存终端屏幕上可见的一小部分信息(数百行)。我后来使用 strace 来确定应用程序在屏幕上打印这些信息的方式 - 它正在写入 /dev/tty0 设备(不是 /dev/tty,而是 /dev/tty0,当前可见的控制台,这使得 - 我认为 - 一个巨大差距)。意识到这一点,我尝试了许多可能的解决方案来捕获此输出,包括:
- 屏幕会话和记录到文件
- 用 python 编写的用于捕获 tty 写入的包装器 (How to redirect a program that writes to tty?)
- 使用“脚本”命令调用软件
这一切都适用于捕捉 /dev/tty 写入,但不适用于 /dev/tty0!
您能提出任何解决方案,甚至只是我可以尝试的想法吗?
【问题讨论】:
-
下一个级别的行为不端的程序是: 强制预加载一个共享库,该库使用
"/dev/tty0"的参数拦截open并重定向它;使用ptrace直接拦截write调用;编写自定义内核模块。 -
谢谢你 melpomene!我正在考虑它,但听起来不是一件容易的事(我仍然称自己为 Linux 世界的新手 :)),如果没有其他方法可行,我会尝试这样做......如果你能指导我找到任何这样的骨架图书馆,我将不胜感激! ptrace - 有趣,需要调查。自定义内核模块 - 我觉得这对我来说太难了,但也许我也需要尝试一下。
-
osletek.com/pg/150/Intercepting_C++_functions_using_LD_PRELOAD 看起来相关,只是您的情况更简单一些,因为它是您要覆盖的普通 C 函数。
-
谢谢你 melpomene!伟大而简单。你说得对,我需要拦截普通的 C 函数——我认为只有两个标准函数:“打开”和“写入”。打开以查找用于进一步写入调用的描述符,并写入以实际捕获输出到例如文件。我将在晚上尝试这个,这将是如何为我拦截系统调用的重要课程:)。我也开始阅读 ptrace,如果有人对此感兴趣:nullprogram.com/blog/2018/06/23 你可以找到一个很好的解释,但你的库方法对我来说看起来更简单和优雅。