Odpowiedzi:
Podczas zamykania wielu instancji bash w tym samym czasie znany jest wyścig, który może spowodować wyczyszczenie historii. Dzieje się tak, ponieważ podczas zapisywania pliku historii bash nie jest używane blokowanie.
Chet Ramey (obecny opiekun bash) dobrze podsumował warunki tego problemu:
Obecny kod (bash-4.3-devel) działa mniej więcej tak, zakładając, że nie ma błędów (lib / readline / histfile.c: history_do_write ()):
- zmień nazwę (histfile, histfile ~)
- otwórz plik za pomocą O_CREAT | O_TRUNC
- bufor malloc wystarczająco duży, aby pomieścić wszystkie dane historyczne
- zapisz wszystkie wpisy historii w jednym wywołaniu write (2)
- zamknąć plik
- rozłącz (plik ~)
Kod bash-4.2 działa w ten sam sposób, tyle że nie tworzy kopii zapasowej pliku historii. Każda powłoka robi to samo po wyjściu, zakładając, że histappend nie jest ustawiony, jak w twojej konfiguracji.
Plik historii może mieć zerową długość na kilka sposobów: malloc może się nie powieść lub zapis może się nie powieść. W wersji bash-4.2 jest już za późno, aby cokolwiek zrobić w tym momencie ze skróconym plikiem historii. W wersji bash-4.3 poprzedni plik historii zostanie przywrócony.
Wątek listy mailingowej z bug-bash zawiera przyzwoitą dyskusję na temat problemów, możliwych rozwiązań i obaw związanych z tym.
Istnieją również inne możliwości:
HISTSIZE
lub HISTFILESIZE
został ustawiony na 0history-size
został ustawiony na 0> "$HISTFILE"
lub podobnego)W tym drugim przypadku możesz sprawdzić, czy ktoś nie uzyskiwał dostępu do Twojego konta i próbuje w brutalny sposób ukryć swoje utwory. Przyjrzeć last
, /var/log/auth
(lub /var/log/secure
na CentOS / RHEL), a jeśli masz to, co stanowi jakiegokolwiek procesu i / lub oprogramowanie audyt może masz zainstalowane.
Jak przypadkowo usunąłem historię bash:
Toczyłem własny alternatywny skrypt readline terminala według pierwszych zasad: https://tiswww.cwru.edu/php/chet/readline/rluserman.html
a następnie przetestowanie go w terminalu. Ten GNU Readline ma wbudowany rozmiar historii i instrukcje zachowania historii, więc rozmiar hist może być ustawiony domyślnie, a tym samym cała twoja historia jest zdmuchnięta.
Odzyskiwanie historii pozostawionej w pamięci:
Jeśli złapiesz go przed ponownym uruchomieniem lub jeśli terminal został otwarty przed wyczyszczeniem, być może będziesz w stanie znaleźć swoją historię w pamięci. Uruchom history | cut -c 8- > histback_user1.txt
na wszystkich otwartych terminalach i dla każdego użytkownika. Jeśli to tworzy plik ze swojej bogatej historii, można wymienić ~/.bash_history
z histback_user1.txt
. Sprawdź także historię wszystkich użytkowników ostatnio zalogowanych do systemu, a także historię roota. W wielu okolicznościach łatwo jest przypadkowo wyczyścić historię bash, więc jeśli chcesz mieć pewność, że nie stracisz historii, potrzebujesz codziennego skryptu kopii zapasowej.
>.bash_history
. Może ktoś był na twoim koncie i próbował ukryć swoje ślady. Sprawdź nietypowe czasy logowania za pomocąlast
, szukaj przez/var/log/auth.log
(w zależności od systemu).