Was könnte dazu führen, dass mein Bash-Verlauf unerwartet gelöscht wird?

16

Heute habe ich gemerkt, dass mein Bash-Verlauf vollständig gelöscht ist. Ich habe history -cdie .bash_historyDatei weder ausgeführt noch gelöscht . Abgesehen vom Löschen der .bash_historyDatei und history -cwie kann der Bash-Verlauf gelöscht werden?

nik.1
quelle
2
Es hätte zB passieren können >.bash_history. Vielleicht war jemand in Ihrem Konto und hat versucht, seine Spuren zu verbergen. lastSuchen Sie nach ungewöhnlichen Anmeldezeiten mit , bis /var/log/auth.log(abhängig von Ihrem System).
ott--

Antworten:

16

Wenn mehrere Bash-Instanzen gleichzeitig geschlossen werden, ist eine Race-Bedingung bekannt, die zum Löschen des Verlaufs führen kann. Dies liegt daran, dass beim Schreiben der Bash-Verlaufsdatei keine Sperre verwendet wird.

Chet Ramey (der aktuelle Bash-Betreuer) gab eine gute Zusammenfassung der Bedingungen für dieses Problem:

Der aktuelle Code (bash-4.3-devel) funktioniert ungefähr so, sofern keine Fehler vorliegen (lib / readline / histfile.c: history_do_write ()):

  • umbenennen (histfile, histfile ~)
  • Datei mit O_CREAT | O_TRUNC öffnen
  • Malloc-Puffer, der groß genug ist, um alle Verlaufsdaten aufzunehmen
  • Schreiben Sie alle Verlaufseinträge in einem Schreibaufruf (2)
  • Datei schließen
  • Verknüpfung aufheben (histfile ~)

Der bash-4.2-Code funktioniert genauso, nur dass die Verlaufsdatei nicht gesichert wird. Jede Shell tut dasselbe, wenn sie beendet wird, vorausgesetzt, dass kein Histappend festgelegt ist, wie in Ihrer Konfiguration.

Es gibt verschiedene Möglichkeiten, wie die Verlaufsdatei eine Länge von Null erreichen kann: Der Malloc kann fehlschlagen oder der Schreibvorgang kann fehlschlagen. In bash-4.2 ist es zu spät, an dieser Stelle etwas gegen die abgeschnittene Verlaufsdatei zu unternehmen. In Bash-4.3 wird die vorherige Verlaufsdatei wiederhergestellt.

Dieser Mailinglisten-Thread von bug-bash enthält eine anständige Diskussion der Probleme, möglichen Lösungen und Bedenken, die damit verbunden sind.

Es gibt auch einige andere Möglichkeiten:

  • Irgendwann wurde Ihr HISTSIZEoder HISTFILESIZEauf 0 gesetzt
  • Irgendwann wurde Ihre Readline history-sizeauf 0 gesetzt
  • Jemand hat absichtlich oder unbeabsichtigt die Bash-Historie gelöscht (via > "$HISTFILE"oder ähnlich)

In letzterem Fall möchten Sie möglicherweise überprüfen, ob jemand nicht auf Ihr Konto zugegriffen hat und versucht, seine Titel grob auszublenden. Werfen Sie einen Blick auf last, /var/log/auth(oder /var/log/secureauf CentOS / RHEL), und wenn Sie es haben, jeder Prozess Buchhaltung und / oder Revisions Software installiert haben.

Chris Down
quelle
1

So habe ich versehentlich meinen Bash-Verlauf gelöscht:

Ich habe mein eigenes alternatives Terminal-Readline-Skript nach den ersten Prinzipien erstellt: https://tiswww.cwru.edu/php/chet/readline/rluserman.html

und dann in einem Terminal testen. In dieser GNU Readline sind eine Verlaufsgröße und Anweisungen zur Aufbewahrung des Verlaufs integriert, sodass die Standardgröße verwendet werden kann und somit der gesamte Verlauf weggeblasen wird.

Wiederherstellung der Historie, wenn im Speicher belassen:

Wenn Sie es vor einem Neustart abfangen oder wenn ein Terminal vor dem Löschen offen gelassen wurde, können Sie Ihren Verlauf möglicherweise im Speicher finden. Laufen Sie history | cut -c 8- > histback_user1.txtauf allen Terminals, die noch offen sind, und für jeden Benutzer. Wenn das eine Datei mit Ihrer erweiterten Geschichte erzeugt, dann können Sie ersetzen ~/.bash_historymit histback_user1.txt. Überprüfen Sie auch den Verlauf aller kürzlich am System angemeldeten Benutzer sowie den Verlauf von root. Es ist unter vielen Umständen einfach, den Bash-Verlauf versehentlich zu löschen. Wenn Sie also sicher sein möchten, dass kein Verlauf verloren geht, benötigen Sie ein tägliches Sicherungsskript.

Eric Leschinski
quelle
Vielen Dank . Ich weiß nicht, was zum Teufel passiert ist, aber meine Geschichte wurde gestern zurückgesetzt und erst jetzt habe ich es bemerkt. Aber zum Glück hatte ich nicht ein Terminalfenster offen, sondern 10 (!). Es ist jetzt alles gut.
Marc.2377