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

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

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

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

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

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

出于同样的目的,如果能看到安装特定软件包后文件系统发生了什么变化,那就太好了。这会让我知道配置文件放在哪里。

PS我使用的是Ubuntu 14.04

答案1

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

sudo -e /etc/bash.bashrc

附加到该文件的末尾:

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

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

sudo -e /etc/rsyslog.d/bash.conf

还有内容...

local6.*    /var/log/bash_commands.log

重新启动 rsyslog:

sudo service rsyslog restart

登出。登录。日志轮换:

sudo -e /etc/logrotate.d/rsyslog

有一个日志文件列表可以以相同的方式轮换...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

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

/var/log/bash_commands.log

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

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

dpkg-query -L [package_name]

所以你可以在安装软件时执行类似的操作。

dpkg-query -L abc-package > /var/log/files_abc-package.log

相关内容