Verlauf aus ~ / .bash_history löschen


8

Ich habe ein paar Fragen zum Terminal- oder Befehlszeilenverlauf, der in gespeichert ist ~/.bash_history.

  1. Ich kann die Datei im Terminal mit dem historyBefehl sehen, aber wenn ich versuche, sie mit gedit bash_historyder Datei zu öffnen, ist sie vollständig leer. Warum?

  2. Ich habe herausgefunden, wie eine bestimmte Anzahl von Zeilen in der Datei mit dieser Codezeile vom Terminal gelöscht werden kann:

    for i in {1..N}; do history -d N; done

    Dabei ist N die Anzahl der Zeilen (oder Befehle), die Sie löschen möchten, aber jetzt zeigt die Verlaufsdatei diesen letzten Befehl an, und das ist nicht sehr klug, wenn Sie versuchen, Ihre Inhalte zu behandeln. Die Frage ist also: Wie kann ich die letzte Codezeile angeben und sicherstellen, dass diese nicht aufgezeichnet wird?



Wenn Sie in Zukunft einen Befehl mit einem Leerzeichen starten, wird dieser Befehl nicht in Ihrem Verlauf gespeichert.
Paddy Landau

Antworten:


18
  1. Sie haben gerade den vorhergehenden Punkt vergessen. Der Befehl zum Öffnen Ihrer (Bash-) Terminal-Verlaufsdatei lautet

    gedit ~/.bash_history

    Diese Datei wird nur dann aktualisiert , wenn Sie in der Nähe einen Terminal.

  2. Um die letzten 10 Zeilen aus dieser Datei zu entfernen und diesen Befehl nicht selbst aufzuzeichnen, öffnen Sie ein neues Terminal und führen Sie die folgende Befehlskette aus:

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    oder

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    oder

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedoder headlöscht jeweils die ausgewählten Zeilen aus ~/.bash_history, history -clöscht den Verlauf des Terminals und exitschließt ihn.


Eine kürzere und hoffentlich schnellere Alternative zu for+ sed: head -n -Nwobei Großbuchstaben Ndie Anzahl der zu entfernenden Zeilen sind. stackoverflow.com/a/13380679/711006
Melebius

2
@Melebius Sieht vielversprechend aus, aber wie leiten Sie die Ausgabe in die Eingabedatei um, indem Sie sie überschreiben? head -n -N testfile > testfilelöscht nur die Datei! Ich habe eine Problemumgehung hinzugefügt, die jedoch sicherlich nicht kürzer ist.
Nachtisch

Sie haben Recht, ich habe vergessen, dass headdas nicht an Ort und Stelle funktionieren kann sed. Ich habe hauptsächlich nach einem einzigen sedBefehl gesucht, der Ihre forSchleife ersetzt. Es gibt einige Optionen auf der Seite, die ich verlinkt habe, aber sie sehen nicht so verständlich aus wie Ihr Code.
Melebius

@Melebius Siehe sed1line.txt dazu - ich habe es oben hinzugefügt, es ist nicht wirklich kürzer, sollte aber schneller sein.
Nachtisch

4

Die Datei bash_history ist eine versteckte Datei, die mit einem Punkt beginnt. Du musst tun

gedit ~/.bash_history

Dadurch wird die Datei in gedit geöffnet.


1

Wenn Sie nur bestimmte Teile Ihres Befehlsprotokolls löschen möchten, sind die oben genannten Methoden in Ordnung. Wenn Sie die Befehlsprotokollierung für eine bestimmte Bash-Sitzung beenden möchten, geben Sie den Befehl aus

unset HISTFILE

Um drastischer zu sein, wenn Sie nicht möchten, dass einer Ihrer Befehle protokolliert wird , können Sie dies tun

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

Beachten Sie, dass die erste Methode nur für eine einzelne Sitzung wirksam ist, während die zweite Methode die Befehlsprotokollierung für alle zukünftigen Sitzungen beendet.


1

Mir ist klar, dass dies bereits eine akzeptierte Antwort hat, aber so mache ich es seit den 80ern. Es ist eine großartige Möglichkeit, Ihre Spuren zu verbergen, und es ist ein mehrphasiger Ansatz. Zum größten Teil ist es eines, das nicht bemerkt wird, wenn man nicht wirklich aufpasst. Hier ist, wie es gemacht wird.

Öffnen Sie ein Terminal / eine Shell / eine Sitzung und führen Sie folgende Schritte aus:

 chmod 444 ~/.bash_history

Verlassen Sie die Shell. Öffnen Sie ein Terminal / eine Shell / eine Sitzung und gehen Sie wie folgt vor: Hier sind einige kreative Möglichkeiten, um den Verlauf dauerhaft zu löschen

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2 (Erstelle eine gefälschte Geschichte)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

dann für ein gutes Maß:

 chmod 444 ~/.bash_history

Verlasse die Shell

Öffnen Sie eine neue Shell und geben Sie ein

 history

Was es weniger auffällig macht, ist, wenn man ein ls -ratl macht, wird die ~ / .bash_history irgendwann im Rasseln der Verzeichnisliste verschwinden. Es wird nicht als Link angezeigt, der unnötige Aufmerksamkeit erregen würde. Die meisten Leute machen kein -a an ihrer Wurzel, was nützlich ist, wenn eine Emulation gewünscht wird.

Der Nachteil dieses Ansatzes ist, dass Sie nicht mehr in der Lage sind, Ihren Verlauf abzurufen. Die eigentliche ~ / .bash_history-Datei könnte auch am Anfang einer Verzeichnisliste stehen, da sie im Laufe der Zeit möglicherweise ein wirklich altes Änderungsdatum aufweist, was an sich zu der Entdeckung führen kann, dass etwas nicht stimmt.


wenn Sie verwenden 9999999 ddalle Zeilen in der Datei zu löschen , dann :%d, :1,$doder dGArbeit viel besser
phuclv

0

1) Ausführen sh; Dies erzeugt eine Unterschale aus Asche, die überhaupt keine Geschichte aufzeichnet. Von dort aus bearbeiten

2) Fügen Sie die Zeile HISTCONTROL=ignorebothzu hinzu .bashrcund exec bashersetzen Sie die aktuelle Shell dauerhaft durch eine neu initialisierte Shell. Führen Sie dann alle Befehle aus, die nicht mit einem führenden Leerzeichen protokolliert werden sollen.


0

da ich noch keinen Kommentar abgeben kann, werde ich meine Kommentare als Antwort hinzufügen:

man history werde alles beantworten.

Antwort auf # 1 ist, dass die Geschichte gespeichert ist. history -asofort in Datei speichern. history -wspeichert auch, kann aber andere Sitzungen durcheinander bringen.

Antwort 2 : history -a, gedit, löschen Sie die gewünschten Zeilen,history -r


0

Der Verlauf wird erst gespeichert, wenn Sie sich von der Shell abmelden. Versuchen Sie, sich von der Shell abzumelden, und sehen Sie sich dann erneut .bash_history an. Der Befehlsverlauf sollte dort sein.


Bearbeitet wie vorgeschlagen Gut genug jetzt?
Der
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.