Co może spowodować nieoczekiwane wyczyszczenie mojej historii bashów?


16

Dzisiaj zauważyłem, że moja historia bash jest całkowicie wyczyszczona. Nie wykonałem ani history -cnie usunąłem .bash_historypliku. Oprócz usunięcia .bash_historypliku i history -cjak można wyczyścić historię bash?


2
Mogło się to zdarzyć np >.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).
ott--

Odpowiedzi:


17

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:

  • W pewnym momencie twój HISTSIZElub HISTFILESIZEzostał ustawiony na 0
  • W pewnym momencie twój odczyt history-sizezostał ustawiony na 0
  • Ktoś, umyślnie lub nieumyślnie, wyczyścił historię bash (za pośrednictwem > "$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/securena CentOS / RHEL), a jeśli masz to, co stanowi jakiegokolwiek procesu i / lub oprogramowanie audyt może masz zainstalowane.


1

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.txtna wszystkich otwartych terminalach i dla każdego użytkownika. Jeśli to tworzy plik ze swojej bogatej historii, można wymienić ~/.bash_historyz 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.


Dziękuję . Nie wiem, co się do cholery stało, ale moja historia została wczoraj zresetowana i dopiero teraz to zauważyłem. Ale, na szczęście, nie miałem otwartego okna terminala, ale 10 (!). Teraz wszystko jest dobrze.
Marc.2377,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.