Ответы:
При одновременном закрытии нескольких экземпляров bash возникает известное состояние гонки, которое может привести к очистке истории. Это происходит потому, что при записи файла истории bash блокировка не используется.
Чет Рэйми (текущий сопровождающий bash) дал хорошее резюме условий для этой проблемы:
Текущий (bash-4.3-devel) код работает примерно так, не допуская ошибок (lib / readline / histfile.c: history_do_write ()):
- переименовать (Histfile, Histfile ~)
- открыть файл с помощью O_CREAT | O_TRUNC
- буфер malloc достаточно большой для хранения всех данных истории
- записать все записи истории в один вызов write (2)
- закрыть файл
- отменить связь (исторический файл ~)
Код bash-4.2 работает так же, за исключением того, что он не создает резервную копию файла истории. Каждая оболочка делает то же самое, когда она выходит, предполагая, что гистапенд не установлен, как в вашей конфигурации.
Есть несколько способов, которыми файл истории может закончиться нулевой длиной: 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
(в зависимости от вашей системы).