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

nik*_*k.1 18 bash command-history

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

Chr*_*own 20

同时关闭多个 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) 调用中写入所有历史条目
  • 关闭文件
  • 取消链接(历史文件~)

bash-4.2 代码的工作方式相同,只是它不备份历史文件。每个 shell 在退出时都做同样的事情,假设 histappend 没有设置,就像在你的配置中一样。

历史文件可能以多种方式结束为零长度:malloc 可能失败,或者写入可能失败。在 bash-4.2 中,此时对截断的历史文件做任何事情都为时已晚。在 bash-4.3 中,之前的历史文件将被恢复。

这个来自 bug-bash 的邮件列表线程包含对问题、可能的解决方案和围绕此问题的关注的体面讨论。

还有一些其他的可能性:

  • 在某些时候,您的HISTSIZEorHISTFILESIZE被设置为 0
  • 在某些时候,你的 readlinehistory-size被设置为 0
  • 有人有意或无意地擦除了 bash 历史记录(通过> "$HISTFILE"或类似方式)

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