Wo wird die Geschichte der Bash gespeichert?

95

Wenn ich renne history, kann ich meine zuletzt ausgeführten Befehle sehen.

Aber wenn ich tail -f $HISTFILEoder tail -f ~/.bash_history, werden sie nicht aufgelistet.

Wird die Datei gesperrt, gibt es einen temporären Speicherort oder ähnliches?

Adionditsak
quelle

Antworten:

117

Bash verwaltet die Liste der Befehle im internen Speicher, während sie ausgeführt wird. Sie werden .bash_historybeim Verlassen beschrieben :

Wenn eine interaktive Shell beendet wird, werden die letzten $ HISTSIZE-Zeilen aus der Verlaufsliste in die Datei mit dem Namen $ HISTFILE kopiert

Wenn Sie das Ausschreiben des Befehlsverlaufs erzwingen möchten, können Sie den folgenden history -aBefehl verwenden:

Hängen Sie die neuen Verlaufszeilen (die seit Beginn der aktuellen Bash-Sitzung eingegebenen Verlaufszeilen) an die Verlaufsdatei an.

Es gibt auch eine -wOption:

Schreiben Sie den aktuellen Verlauf in die Verlaufsdatei.

Was Ihnen besser gefällt, hängt davon ab, wie Sie Ihre Vorgeschichte verwenden.

Wenn Sie sicherstellen möchten, dass sie immer sofort geschrieben werden, können Sie diesen Befehl in Ihre PROMPT_COMMANDVariable einfügen:

export PROMPT_COMMAND='history -a'
Michael Homer
quelle
Randnotiz: Wenn Ihre .bash_historyDatei versehentlich root gehört, funktionieren die Dinge nicht mehr. Überprüfen Sie in diesem Fall den Besitz und sudokorrigieren Sie ihn bei Bedarf.
Torek
13

(Keine Antwort, aber ich kann keine Kommentare hinzufügen)

Wenn Sie überprüfen, .bash_historyweil Sie nur einen bestimmten Befehl löschen möchten (z. B. ein Passwort in clear enthalten), können Sie den Eintrag im Speicher direkt durch löschen history -d <entry_id>.

Angenommen, eine Ausgabe lautet wie folgt:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

Wenn Sie die exportLeitung löschen möchten , können Sie dies einfach erreichen, indem Sie:

history -d 928
Eddie C.
quelle
11

bash speichert es im Arbeitsspeicher. bash kann so konfiguriert werden, dass es beim Schließen von bash oder nach jedem Befehl gespeichert und beim Starten von bash oder auf Anfrage geladen wird.

Wenn Sie das Speichern nach jedem Befehl konfigurieren, sollten Sie berücksichtigen, dass mehrere Bashs gleichzeitig ausgeführt werden. (Kommandozeilen werden verschachtelt)

Strg-Alt-Delor
quelle
2
Wenn Sie mit der Beantwortung beginnen, klingt es so, als ob der Verlauf in einer Datei namens bash oder sogar in der bashExetable gespeichert ist. Ich würde schreiben "Es wird bashim Speicher gespeichert , ..."
Anthon
Das ist in der Tat besser
Anthon
5

Befehle werden im Arbeitsspeicher (RAM) gespeichert, während Ihre Sitzung aktiv ist. Sobald Sie die Shell schließen, wird die Befehlsliste .bash_historyvor dem Herunterfahren beschrieben.

Daher wird der Verlauf der aktuellen Sitzung in nicht angezeigt .bash_history.

JaySo
quelle
4
Die Verlaufsdatei wird beim bashBeenden aktualisiert , was keinen Neustart bedeutet (insbesondere in grafischen Umgebungen, in denen Sie Terminals nach Wunsch öffnen und schließen können).
John WH Smith
4

Während der Ausführung wird der Verlauf (standardmäßig) nur gespeichert, wenn:

  • set -o history (ein Hin echo "$-") wird gesetzt.
  • HISTSIZE ist nicht 0 und
  • HISTIGNORE ist nicht *(oder ein anderes sehr restriktives Muster).

Wenn einer der oben genannten Vorgänge fehlschlägt, wird kein Verlauf im Speicher gespeichert und folglich kann oder wird kein Verlauf auf die Festplatte geschrieben.

Der Verlauf im Speicher wird auf die Festplatte geschrieben, wenn:

  • HISTFILESIZE ist nicht 0 und
  • HISTFILE ist nicht aufgehoben.

Aber nur, wenn die Shell beendet wird oder wenn die Befehle history -a(Anhängen) oder history -w(Schreiben) ausgeführt werden.

Um ein sofortiges Schreiben auf die Festplatte auszulösen, können Sie die Variable verwenden:

 PROMPT_COMMAND='history -a'

In diesem Fall wird appendder newVerlauf in die Verlaufsdatei geschrieben. Hierbei handelt es sich um Verlaufszeilen, die seit Beginn der aktuellen Bash-Sitzung eingegeben, jedoch nicht bereits an die Verlaufsdatei angehängt wurden.

Oder:

 PROMPT_COMMAND='history -w'

Den Verlauf in der HISTFILE mit der Liste aus dem Speicher überschreiben .

So können Sie einen Befehl aus dem Verlauf im Speicher entfernen:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

Und schreibe es mit dem letzten Befehl auf die Festplatte:

 history -w    # with `shopt -u histappend` unset
Isaac
quelle
Wäre etwas falsch, wenn Sie dies in einen Cron-Job stecken würden? Ich vermute, dass sich viele Benutzer mit weitaus weniger Benutzernamen auf einem bestimmten Server
anmelden