如何记录输入到 bash 中的每个命令和每个文件操作

P i*_*P i 4 bash logs

我想记录输入到 bash 中的每个命令(由 root 或用户)以及每个文件操作。

这个想法是我可以编写工具来查询这个日志文件并提供非常有用的信息。

例如,最好列出所有输入过的命令,每行一个,用“- - -”表示 8-24 小时的时间间隔,用“== = 例如 2014 年 6 月 24 日 === 表示 >24 小时的间隔。如果它还消除了“====...”会话中的重复项,那就更好了!

这意味着每当我完成诸如“将flask/mod_wsgi/apache 升级到Python 3.x”之类的任务时,都会留下一条记录,如果六个月后我必须做同样的事情,我可以找到一条线索。

为了同样的目的,很高兴看到安装特定软件包后发生了哪些文件系统更改。这会让我知道配置文件放在哪里。

PS 我在 Ubuntu 14.04

Chr*_*her 6

这不像真正的记账那么全面,并且它可以被用户轻松撤消,但假设它不必是真正的记账系统并且 BASH 和 rsyslog 都在使用中,请编辑系统范围的 BASH RC 文件:

sudo -e /etc/bash.bashrc
Run Code Online (Sandbox Code Playgroud)

附加到该文件的末尾:

export PROMPT_COMMAND='RET_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RET_VAL]"'
Run Code Online (Sandbox Code Playgroud)

上面,logger记录了时间、用户、命令和命令返回值。使用新文件为“local6”设置日志记录:

sudo -e /etc/rsyslog.d/bash.conf
Run Code Online (Sandbox Code Playgroud)

而内容...

local6.*    /var/log/bash_commands.log
Run Code Online (Sandbox Code Playgroud)

重启 rsyslog:

sudo service rsyslog restart
Run Code Online (Sandbox Code Playgroud)

登出。登录。日志轮换:

sudo -e /etc/logrotate.d/rsyslog
Run Code Online (Sandbox Code Playgroud)

有一个日志文件列表以相同的方式旋转......

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message
Run Code Online (Sandbox Code Playgroud)

在该列表中添加新的 bash-commands 日志文件:

/var/log/bash_commands.log
Run Code Online (Sandbox Code Playgroud)

保存并重新启动/重新加载 rsyslog。(轮换最终会覆盖日志文件,因此可能需要更多思考或配置。)

要查看软件包已安装的所有文件:

dpkg-query -L [package_name]
Run Code Online (Sandbox Code Playgroud)

因此,您可以在安装软件时执行类似的操作。

dpkg-query -L abc-package > /var/log/files_abc-package.log
Run Code Online (Sandbox Code Playgroud)