![如何记录 bash 中输入的每个命令和每个文件操作](https://linux22.com/image/66386/%E5%A6%82%E4%BD%95%E8%AE%B0%E5%BD%95%20bash%20%E4%B8%AD%E8%BE%93%E5%85%A5%E7%9A%84%E6%AF%8F%E4%B8%AA%E5%91%BD%E4%BB%A4%E5%92%8C%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C.png)
我想记录在 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