Что может привести к неожиданному удалению моей истории bash?

16

Сегодня я заметил, что моя история bash полностью очищена. Я не выполнил и history -cне удалил .bash_historyфайл. Помимо удаления .bash_historyфайла и history -cкак очистить историю bash?

nik.1
источник
2
Это могло произойти, например >.bash_history. Возможно, кто-то был в вашем аккаунте и пытался скрыть свои следы. Проверьте необычное время входа в систему с помощью функции lastпоиска /var/log/auth.log(в зависимости от вашей системы).
ot--

Ответы:

17

При одновременном закрытии нескольких экземпляров 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был установлен на 0
  • В какой-то момент ваша readline history-sizeбыла установлена ​​на 0
  • Кто-то, умышленно или неумышленно, стер историю бэша (с помощью > "$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_historyна histback_user1.txt. Также проверьте историю всех пользователей, недавно вошедших в систему, а также историю root. Легко случайно очистить историю bash при многих обстоятельствах, поэтому, если вы хотите быть уверенным в том, что история не потеряна, вам необходим ежедневный скрипт резервного копирования.

Эрик Лещинский
источник
Спасибо . Я не знаю, что, черт возьми, произошло, но моя история была сброшена вчера, и только сейчас я заметил это. Но, к счастью, у меня было открыто не одно окно терминала, а 10 (!). Теперь все хорошо.
23