Wenn ich renne history
, kann ich meine zuletzt ausgeführten Befehle sehen.
Aber wenn ich tail -f $HISTFILE
oder tail -f ~/.bash_history
, werden sie nicht aufgelistet.
Wird die Datei gesperrt, gibt es einen temporären Speicherort oder ähnliches?
Wenn ich renne history
, kann ich meine zuletzt ausgeführten Befehle sehen.
Aber wenn ich tail -f $HISTFILE
oder tail -f ~/.bash_history
, werden sie nicht aufgelistet.
Wird die Datei gesperrt, gibt es einen temporären Speicherort oder ähnliches?
Antworten:
Bash verwaltet die Liste der Befehle im internen Speicher, während sie ausgeführt wird. Sie werden .bash_history
beim 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 -a
Befehl verwenden:
Hängen Sie die neuen Verlaufszeilen (die seit Beginn der aktuellen Bash-Sitzung eingegebenen Verlaufszeilen) an die Verlaufsdatei an.
Es gibt auch eine -w
Option:
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_COMMAND
Variable einfügen:
export PROMPT_COMMAND='history -a'
(Keine Antwort, aber ich kann keine Kommentare hinzufügen)
Wenn Sie überprüfen, .bash_history
weil 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 export
Leitung löschen möchten , können Sie dies einfach erreichen, indem Sie:
history -d 928
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)
bash
Exetable gespeichert ist. Ich würde schreiben "Es wird bash
im Speicher gespeichert , ..."
Befehle werden im Arbeitsspeicher (RAM) gespeichert, während Ihre Sitzung aktiv ist. Sobald Sie die Shell schließen, wird die Befehlsliste .bash_history
vor dem Herunterfahren beschrieben.
Daher wird der Verlauf der aktuellen Sitzung in nicht angezeigt .bash_history
.
bash
Beenden aktualisiert , was keinen Neustart bedeutet (insbesondere in grafischen Umgebungen, in denen Sie Terminals nach Wunsch öffnen und schließen können).
Während der Ausführung wird der Verlauf (standardmäßig) nur gespeichert, wenn:
H
in echo "$-"
) wird gesetzt.0
und*
(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:
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 append
der new
Verlauf 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
.bash_history
Datei versehentlich root gehört, funktionieren die Dinge nicht mehr. Überprüfen Sie in diesem Fall den Besitz undsudo
korrigieren Sie ihn bei Bedarf.