今天我注意到我的 bash 历史记录被完全清除了。我既没有执行history -c
也没有删除该.bash_history
文件。除了删除.bash_history
文件 和 之外history -c
,如何清除 bash 历史记录?
答案1
当同时关闭多个 bash 实例时,存在一个已知的竞争条件,可能会导致历史记录被清除。发生这种情况是因为写入 bash 历史文件时没有使用锁定。
Chet Ramey(现任 bash 维护者)给出了很好的总结本问题的条件:
当前(bash-4.3-devel)代码的工作原理如下,假设没有错误(lib/readline/histfile.c:history_do_write()):
- 重命名(histfile,histfile~)
- 使用 O_CREAT|O_TRUNC 打开文件
- malloc 缓冲区足够大以容纳所有历史数据
- 在一次 write(2) 调用中写入所有历史记录条目
- 关闭文件
- 取消链接(histfile~)
bash-4.2 代码的工作方式相同,只是它不备份历史文件。每个 shell 在退出时都会执行相同的操作,假设未设置 histappend(如您的配置所示)。
历史文件有多种可能导致长度为零的情况:malloc 可能会失败,或者写入可能会失败。在 bash-4.2 中,此时对截断的历史文件进行任何操作都为时已晚。在bash-4.3中,将恢复之前的历史文件。
此邮件列表主题来自 bug-bash 包含对问题、可能的解决方案以及围绕此问题的担忧的适当讨论。
还有一些其他的可能性:
- 在某个时刻,您的
HISTSIZE
orHISTFILESIZE
被设置为 0 - 在某个时刻,你的 readline
history-size
被设置为 0 - 有人,无论是有意还是无意,擦除了 bash 历史记录(通过
> "$HISTFILE"
或类似的方式)
在后一种情况下,您可能需要检查是否有人没有访问您的帐户并试图以粗暴的方式隐藏他们的踪迹。查看last
,/var/log/auth
(或/var/log/secure
在 CentOS/RHEL 上),如果有的话,请查看您可能安装的任何进程记帐和/或审计软件。
答案2
我如何不小心删除了我的 bash 历史记录:
我根据第一原则滚动了我自己的替代终端 readline 脚本:https://tiswww.cwru.edu/php/chet/readline/rluserman.html
然后在终端中测试它。 GNU Readline 内置了历史记录大小和历史记录保存指令,因此可以默认历史记录大小,这样你的所有历史记录都会被清除。
如果保留在内存中,则恢复历史记录:
如果您在重新启动之前捕获它,或者如果终端在清除之前保持打开状态,您可能能够在内存中找到您的历史记录。history | cut -c 8- > histback_user1.txt
在所有打开的终端上运行并为每个用户运行。如果这会生成一个包含您的扩展历史记录的文件,那么您可以替换~/.bash_history
为histback_user1.txt
.还要检查最近登录系统的所有用户的历史记录以及 root 的历史记录。在很多情况下很容易意外清除 bash 历史记录,因此如果您想确保历史记录不丢失,则需要每日备份脚本。