【问题标题】:Capturing /dev/tty0 output to file将 /dev/tty0 输出捕获到文件
【发布时间】:2018-08-27 09:46:59
【问题描述】:

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

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

这一切都适用于捕捉 /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 你可以找到一个很好的解释,但你的库方法对我来说看起来更简单和优雅。

标签: linux capture tty


【解决方案1】:

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

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

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

  3. Ptrace 方法 - 乍一看很复杂,但很有逻辑,但你需要阅读 longy man 才能理解。再一次,对于分叉的流程,事情变得复杂了,但我现在已经接近创建可行的解决方案了,像 PTRACE_O_TRACEFORK 之类的东西有很大帮助。

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

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

感谢 melpomene 的启发! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 2012-11-23
    • 2019-04-19
    • 2011-04-28
    • 2023-03-31
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多