是什么导致我的bash历史记录意外清除?


16

今天,我注意到我的bash历史记录已全部清除。我既没有执行history -c也没有删除.bash_history文件。除了删除.bash_history文件和之外history -c,如何清除bash历史记录?


2
可能是发生了>.bash_history。也许有人在您的帐户中并试图隐藏他的踪迹。last通过搜索/var/log/auth.log(取决于您的系统)来检查异常的登录时间。
ott--

Answers:


17

同时关闭多个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代码的工作方式相同,只是它不备份历史记录文件。假设未设置histappend,则每个shell退出时都会执行相同的操作,与您的配置相同。

历史记录文件可以以零长度结尾有两种方式:malloc可能失败,或者写入可能失败。在bash-4.2中,此时对已截断的历史记录文件执行任何操作为时已晚。在bash-4.3中,将还原以前的历史记录文件。

来自bug-bash的邮件列表线程包含对问题,可能的解决方案以及与此相关的关注的不错的讨论。

还有其他一些可能性:

  • 在某个时候,您的HISTSIZEHISTFILESIZE设置为0
  • 在某些时候,您的readline history-size设置为0
  • 有人(有意或无意)抹掉了bash的历史记录(通过> "$HISTFILE"或类似方式)

在后一种情况下,您可能希望检查是否有人没有访问您的帐户,并试图以粗略的方式隐藏他们的足迹。看看last/var/log/auth(或/var/log/secure在CentOS / RHEL),如果你拥有它,任何进程记账和/或你可能已经安装了审计软件。


1

我不小心删除了我的bash历史记录:

我从第一条原则开始编写自己的替代终端readline脚本:https : //tiswww.cwru.edu/php/chet/readline/rluserman.html

然后在终端中进行测试。GNU Readline具有内置的历史记录大小和历史记录保存说明,因此可以默认设置历史记录大小,因此您所有的历史记录都被删除了。

如果保留在内存中,则恢复历史记录:

如果您在重新启动之前捕获了它,或者如果终端在清除之前一直处于打开状态,则可能可以在内存中找到您的历史记录。运行history | cut -c 8- > histback_user1.txt在所有的终端开路且为每一位用户。如果那产生的文件具有您的扩展历史记录,则可以替换~/.bash_historyhistback_user1.txt。还要检查最近登录系统的所有用户的历史记录以及root的历史记录。在许多情况下,不小心清除bash历史记录很容易,因此,如果要确保不丢失历史记录,则需要每日备份脚本。


谢谢。我不知道发生了什么事,但是昨天我的历史被重置,直到现在我才注意到。但是,幸运的是,我没有打开一个终端窗口,而是10(!)。现在一切都很好。
Marc.2377
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.