仪表板外壳的调试信号陷阱?

Cos*_*imo 11 linux debian bash shell dash-shell

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

$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG
Run Code Online (Sandbox Code Playgroud)

例如,这里的想法是将陷阱安装在放入的文件中,/etc/profile.d/bash-logger并让任何用户 shell 会话命令在发生时自动记录到系统日志中。这对于轻松跟踪远程命令也很有用。

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

是否有任何解决方法或替代方法可以使用破折号外壳实现相同的结果?

小智 0

最彻底的方法是重新编译 shell 并启用 syslog 支持。这也绕过了(无论出于何种原因)不加载 ~/. 无论-profile 或 ~/. 无论如何-rc。

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

我会犹豫是否建议eval逐行阅读和 ing,因为命令可以跨越多行,并且eval半个命令要么失败,要么做错误的事情。受影响的命令类型包括:管道和条件命令(每行以&&,||或结尾|)、复合命令(包括括号组)、以反斜杠继续的行、多行引用字符串和<<此处文档。(可能比我没想到的还要多。)

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

我想指出的是,如果你去 ssh host some_command 的话,就不会涉及交互式或登录 shell,因此你的 rc 文件不会被加载,这将绕过你的日志记录。