有没有一种简单的方法来记录所有执行的命令,包括命令行参数?

Pet*_*ace 15 logs proc audit arguments

我试图找到如何记录特定实例化rrdtool以查看它接收的路径是否不正确。

我知道我可以将可执行文件包装在一个可以记录参数的 shell 脚本中,但我想知道是否有一种更特定于内核的方法来监视它,也许是一个文件系统回调,可以看到特定的 /proc/pid/exe匹配给定的二进制文件?

Gil*_*il' 20

是的,有一个内核工具:审计子系统。该auditd守护进程会进行记录,并命令auditctl设置的日志记录规则。您可以将所有调用记录到特定系统 alls,并进行一些过滤。如果要记录所有执行的命令及其参数,请记录execve系统调用:

auditctl -a exit,always -S execve
Run Code Online (Sandbox Code Playgroud)

要专门跟踪特定程序的调用,请在程序可执行文件上添加过滤器:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool
Run Code Online (Sandbox Code Playgroud)

日志显示在/var/log/audit.log,或您的发行版放置它们的任何地方。您需要成为 root 用户才能控制审计子系统。

完成调查后,使用相同的命令行 with-d而不是-a删除日志记录规则,或运行auditctl -D以删除所有审核规则。

出于调试目的,用包装脚本替换程序可以让您更灵活地记录环境、有关父进程的信息等内容。


小智 6

你可以使用史努比

Snoopy 是更轻量级的解决方案,因为它不需要内核协作。所需要的只是动态加载程序 (dl),它预加载 snoopy 库,其路径在/etc/ld.so.preload.

披露:我是当前的史努比维护者。