如何“追踪”诸如shell之类的程序?

如何“追踪”诸如shell之类的程序?

我知道这dash是一个“模型”shell - 它是最近编写的,而且写得很好,它只实现了 POSIX shell 所需的功能。我查看了 dash 源代码,以了解如何对诸如 shell 之类的程序进行“跟踪”。

对 dash 的“跟踪”是通过使用DEBUGdefined 编译它并使用 调用来执行的-o debug。执行此操作时,trace将打开一个文件,其中包含有关运行时正在执行的操作的fopen信息。dash

但在我看来,整个机制不起作用,即使在这个“完美编写”的 shell 中也是如此。如果我在 shell 脚本中有这个:

exec 3>&1

此后的所有信息很可能不再转储到文件中,trace而是最终出现在 上stdout。这是因为fopen调用open和 可能会返回文件描述符 3。

这不是一个虚构的例子。现实世界中常用的脚本有这样的行

exec数字>&1

(我在 2 个自动工具configure脚本中看到了这一点:用于 IP Infusion 和 Kerberos 软件)。

那么当 shell 必须运行这样的脚本时,怎样对其进行调试/跟踪呢?

(我不是在寻找 shell 之外的工具 - 我想知道在诸如 shell 之类的程序内部进行跟踪的正确方法是什么。或者一般来说这是不可能的?)

答案1

您可以使用套接字(系统日志例如执行此操作)。但是,您如何防范类似以下命令

LD_PRELOAD=my_bogus_socket_funcs.so somecommand

或者你可以使用dup2将文件描述符更改为更高的数字。但这并不能保证,也许只能防止脚本错误(例如在重定向中使用 3 而不是 2)。

如果脚本想要故意改变跟踪行为,我相信 shell 能(或应该)做的并不多。

相关内容