是否捕获 dash shell 的 DEBUG 信号?

是否捕获 dash shell 的 DEBUG 信号?

使用 bash shell,您可以在合成信号上安装陷阱DEBUG。这很有用,并且会在每个 shell 命令上执行您的函数或代码片段。例如:

$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG

这里的想法是将陷阱安装在插入的文件中,/etc/profile.d/bash-logger并让任何用户 shell 会话命令在发生时自动记录到 syslog。这也有助于轻松追踪远程命令

查看 dash shell 源代码,我似乎明白没有DEBUG可用的信号。

有没有什么解决方法或替代方法可以使用 dash shell 实现相同的结果?

答案1

最彻底的方法是重新编译启用 syslog 支持的 shell。这还可以解决(无论出于何种原因)不加载 ~/ 的 shell。任何-profile 或 ~/.任何-rc。

这作为 Bash 标准源中的一个选项包含在内,但对于其他 shell,您可能需要查找或编写补丁。

我不太建议eval逐行阅读和执行,因为命令可能跨越多行,而eval半条命令要么失败,要么执行错误。受影响的命令类型包括:管道和条件命令(每行以&&||或结尾|)、复合命令(包括括号组)、以反斜杠结尾的行、多行引用字符串和<<此处文档。(可能还有更多我没有想到的。)

在有限的情况下,您可能会发现set -vset -x很有用,结合将 stderr 重定向到记录器的管道。但是它并不完美,因为它还会将 stderr 从您运行的程序中重定向。(在 Bash 中,您可以选择不同的文件描述符进行set -x写入,这解决了该问题。)

我想指出的是,如果你去 ssh host some_command ,那么就没有涉及交互式或登录 shell,所以你的 rc 文件不会被加载,这会绕过你的日志记录。

相关内容