Відповіді:
Під час закриття декількох екземплярів bash одночасно, відомий стан перегонів, який може призвести до очищення історії. Це відбувається тому, що при записуванні файлу історії bash блокування не використовується.
Chet Ramey (поточний супровідник басу) дав хороший підсумок умов цього питання:
Поточний (bash-4.3-devel) код працює приблизно так, не допускаючи помилок (lib / readline / histfile.c: history_do_write ()):
- перейменувати (histfile, histfile ~)
- відкрити файл з O_CREAT | O_TRUNC
- буфер malloc досить великий, щоб вмістити всі дані історії
- написати всі записи історії в один дзвінок написати (2)
- закрити файл
- від’єднати (істор. файл ~)
Код bash-4.2 працює так само, за винятком того, що він не створює резервну копію файлу історії. Кожна оболонка робить те ж саме, коли вона завершується, припускаючи, що histappend не встановлено, як у вашій конфігурації.
Існує кілька способів, коли файл історії може закінчитися нульовою довжиною: malloc може вийти з ладу або записати не може. У bash-4.2 вже занадто пізно робити що-небудь щодо усіченого файлу історії на той момент. У bash-4.3 попередній файл історії буде відновлено.
Цей потік списку розсилки з помилки-баш містить гідне обговорення проблем, можливих рішень та проблем, пов'язаних із цим.
Є й інші можливості:
HISTSIZE
або HISTFILESIZE
був встановлений на 0history-size
була встановлена на 0> "$HISTFILE"
або подібне)В останньому випадку ви, можливо, захочете перевірити, чи хтось не має доступу до вашого облікового запису і намагається приховати їхні сліди грубо. Подивіться на last
, /var/log/auth
(або /var/log/secure
на CentOS / RHEL), і якщо у вас є, будь-який процес бухгалтерського обліку та / або програмне забезпечення , аудит може бути встановлений.
Як я випадково видалив історію башу:
Я розгортав свій власний сценарій для читання альтернативних терміналів із перших принципів: 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_history
. Можливо, хтось був у вашому обліковому записі і намагався приховати його сліди. Перевірте незвичні часи входу за допомогоюlast
, шукайте через/var/log/auth.log
(залежно від вашої системи).