Answers:
同时关闭多个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的邮件列表线程包含对问题,可能的解决方案以及与此相关的关注的不错的讨论。
还有其他一些可能性:
HISTSIZE
或HISTFILESIZE
设置为0history-size
设置为0> "$HISTFILE"
或类似方式)在后一种情况下,您可能希望检查是否有人没有访问您的帐户,并试图以粗略的方式隐藏他们的足迹。看看last
,/var/log/auth
(或/var/log/secure
在CentOS / RHEL),如果你拥有它,任何进程记账和/或你可能已经安装了审计软件。
我不小心删除了我的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历史记录很容易,因此,如果要确保不丢失历史记录,则需要每日备份脚本。
>.bash_history
。也许有人在您的帐户中并试图隐藏他的踪迹。last
通过搜索/var/log/auth.log
(取决于您的系统)来检查异常的登录时间。