使用 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 -v
或set -x
很有用,结合将 stderr 重定向到记录器的管道。但是它并不完美,因为它还会将 stderr 从您运行的程序中重定向。(在 Bash 中,您可以选择不同的文件描述符进行set -x
写入,这解决了该问题。)
我想指出的是,如果你去
ssh host some_command
,那么就没有涉及交互式或登录 shell,所以你的 rc 文件不会被加载,这会绕过你的日志记录。