Entfernen Sie eine bestimmte Zeile aus der Bash-Verlaufsdatei


Antworten:


108

Sie müssen sich abmelden und wieder anmelden oder ausführen, history -adamit der aktuelle Verlauf auf der Festplatte gespeichert wird.

Dann bearbeiten Sie einfach die Datei ~/.bash_history.


19
Wenn die Umgebungsvariable HISTFILE festgelegt ist, ist die Verlaufsdatei nicht ~ / .bash_history, sondern $ {HISTFILE}.
Karolos

20
Einträge werden in die Verlaufsdatei geschrieben, wenn Sie die Shell verlassen. Nachdem Sie einen Befehl eingegeben haben, den Sie entfernen möchten, müssen Sie sich entweder abmelden und wieder anmelden oder 'history -d xxxx' verwenden, um sie aus der aktuellen Shell-Sitzung zu entfernen.
Harmic

3
aber wie würden Sie die Aufzeichnung der Bearbeitung der Verlaufsdatei löschen?
ChiliNUT

5
@chiliNUT: Starten Sie einfach Ihren Befehl (zB vim ~/.bash_history) mit einem Leerzeichen; Befehle, die mit einem Leerzeichen beginnen, werden normalerweise nicht protokolliert (siehe $HISTCONTROL).
CYRUS

Ich denke nicht, dass das in meiner Distribution der Fall ist, aber im Allgemeinen macht das Sinn
chiliNUT

149

Sie können das Entfernen aus der Verlaufsdatei mithilfe der Befehlszeile in zwei Schritten erreichen:

  1. Durch die history -d <line_number>Eingabe wird eine bestimmte Zeile aus dem Verlauf im Speicher gelöscht.
  2. Durch Eingabe wird history -wder aktuelle Verlauf im Arbeitsspeicher in die ~/.bash_historyDatei geschrieben.

Durch die beiden Schritte wird die Zeile dauerhaft aus dem speicherinternen Verlauf und auch aus der Datei .bash_history entfernt .


7
Wie lösche ich die letzten history -waus der Geschichte?
KrIsHnA

@KrIsHnA ~ / .bash_history manuell bearbeiten
Alexander Myshov

5
Oder fügen Sie ein Leerzeichen , bevor es zu verhindern , dass die hinzugefügt wird, wie in @ tao Antwort
Mark

Um <line_number>nur history | grep [unwanted_content]eine Liste mit allen Zeilen zu finden, die [unwanted_content](wie Passwörter) enthalten.
AvL

Wie löscht man mehrere (bestimmte) Zeilen (nach ID)?
Pathros

39

Um zu verhindern einen Befehl hinzugefügt , um die Geschichte in erster Linie, stellen Sie sicher , dass der Umgebungsvariable HISTCONTROLenthält unter seinem Doppelpunkt getrennten Werten den Wert ignorespace, zum Beispiel (addieren zB .bashrc):

$ export HISTCONTROL=ignorespace

Dadurch wird verhindert, dass ein Befehl mit einem führenden Leerzeichen zum Verlauf hinzugefügt wird. Anschließend können Sie den Verlauf vollständig löschen, indem Sie ausführen

$  history -c -w
  ^-- additional space character

32

Erstens ist es am besten / schnellsten, wenn der Befehl, den Sie ausgeben möchten, vertraulich, unsicher ist oder wenn Sie nicht möchten, dass er Ihre Historie durcheinander bringt, zu verhindern, dass er überhaupt in die Historie eingeht. Stellen Sie sicher, dass Folgendes $HISTCONTROLenthalten ist ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Führen Sie dann einen Befehl aus, den Sie in Ihrem Verlauf nicht benötigen, und geben Sie ein Leerzeichen ein:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

Wenn Sie versehentlich einen unerwünschten Befehl in den Verlauf geschrieben haben, obwohl Ihre Bash-Sitzung noch geöffnet ist, hat der Befehl die Festplatte noch nicht berührt. Geben Sie Folgendes ein, um den vorherigen Befehl im Verlauf zu löschen:

(bash)$  history -d $((HISTCMD-1))

Beachten Sie das führende Leerzeichen. Dieser Befehl erfordert ignorespace, sonst wird es nur selbst löschen!

Wenn Sie die letzten paar Befehle löschen möchten, suchen Sie die letzte und erste Verlaufsnummer:

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

In diesem Fall 602 und 599. Geben Sie dann Folgendes ein:

(bash)$  for i in {602..599}; do history -d $i; done

(Ohne ignorespacewäre es 603..599.)

Wenn Sie nicht möchten, dass der Verlauf Ihrer aktuellen Sitzung auf der Festplatte angezeigt wird, beenden Sie den Vorgang mit:

(bash)$ kill -9 $$

Der bisherige Ansatz besteht darin, sensible Verlaufselemente aus Sicherheitsgründen nicht einmal auf die Festplatte schreiben zu lassen, da theoretisch von nichtflüchtigen Medien gelöschte Daten immer noch wiederhergestellt werden können.

Wenn die zu entfernenden Befehle jedoch aus einer früheren Sitzung stammen, wurden sie bereits an den $HISTFILEOn-Exit angehängt . Wenn Sie den Verlauf mit den oben genannten Befehlen ändern , werden beim Beenden nur die verbleibenden neuen Elemente an die angefügt . Um überschreibt die mit der Ansicht der aktuellen Sitzung der gesamten Geschichte, gerade jetzt , Ausgabe:$HISTFILE$HISTFILE

(bash)$  history -w

Natürlich besteht für Verlaufselemente, die sich bereits auf der Festplatte befinden, die Alternative zum Bearbeiten des Verlaufs mit history -dBefehlen, die dann ausgegeben werden history -w, darin, den Verlauf $HISTFILEmit einem Texteditor zu bearbeiten .


1
„Manipulieren der Geschichte mit den oben genannten Befehle werden nur noch anfügen die verbleibenden neuen Elemente in die $HISTFILE, an der Ausfahrt .“ Eigentlich ist dies nicht ganz richtig ist. Anscheinend werden nur verbleibende neue Elemente angehängt, die sich von der ursprünglichen Verlaufslänge abheben. Wenn ich z. B. 5 Originalelemente entferne und 15 neue hinzufüge, werden nur die letzten 10 neuen Elemente angehängt, wohingegen ich davon ausgehen würde, dass alle 15 neuen Elemente angehängt werden. Ich denke, dies ist ein Fehler, weil ich nicht sehen kann, wie dies jemals wünschenswerte Funktionalität ist.
James Haigh

1
Ich denke, Bash nimmt die ursprüngliche Länge zur Kenntnis. Beim Schließen der Sitzung werden vermutlich Elemente angehängt, deren Anzahl größer als dieser Wert ist. Wenn dieser Wert jedes Mal dekrementiert wird, wenn ein Element gelöscht wird, dessen Anzahl kleiner oder gleich diesem Wert ist, würde dies wie erwartet funktionieren. ;-)
James Haigh

15

Mehrere Techniken:

Verhindern Sie, dass vertrauliche Informationen in der Verlaufsdatei gespeichert werden

Wenn Sie ein Kennwort in eine Befehlszeile eingegeben haben, stellen Sie fest, dass alle Befehle protokolliert werden. Sie können entweder:

  1. Beenden der aktuellen Sitzung erzwingen, ohne den Verlauf zu speichern:

     kill -9 $$

    Dadurch wird der gesamte aktuelle Verlauf gelöscht.

  2. Geben Sie ↑ (up arrow)in der offenen bash Sitzung , bis die sensiblen Informationen angezeigt wird , dann die Zeilenbearbeitung Tastatureingaben wie verwenden Ctrl+ Wdie sensible Informationen zu löschen, und dann ↓ (down arrow) , bis eine neue leere Zeile wird aufgefordert, vor der Eingabe Enter.

Löschen Sie vertrauliche Informationen aus der Verlaufsdatei

Wenn Sie feststellen, dass vertrauliche Informationen bereits gespeichert sind und Sie diese löschen möchten, jedoch nicht Ihren gesamten Verlauf:

Ein einfacher sedBefehl könnte die Arbeit erledigen:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

Bei der Eingabe erstellen Sie jedoch eine weitere Verlaufszeile mit dem Suchmuster (vertrauliche Informationen), das Sie löschen möchten. Sie könnten also:

sed -e "/$(head -n1)/d" -i .bash_history

Dies wird head -n1mit Eingaben vom Terminal ausgeführt. Es scheint, dass Ihr Terminal hängt (es wird keine Eingabeaufforderung angezeigt). Geben Sie einfach die Informationen ein, die Sie aus der Datei löschen möchten. Dies ist ein Trick, mit dem Sie einen Befehl (teilweise) eingeben können, ohne ihn tatsächlich in die Befehlszeile einzugeben, sodass er nicht mehr in den Verlaufsdatensatz aufgenommen werden kann. Dann sedwird der Text verwenden, den Sie durchsuchen getippt .bash_history und löschen Sie alle Zeilen , die sensible Informationen enthalten. Hinweis: Wenn Ihr Muster für vertrauliche Informationen Schrägstriche enthält, müssen Sie diese mit umgekehrten Schrägstrichen versehen oder den sedBefehl so ändern , dass diese Syntax verwendet wird, um ein Trennzeichen anzugeben, das nicht im Muster enthalten ist:

sed -e "\|$(head -n1)|d" -i .bash_history

Eine andere Möglichkeit besteht darin, nur die vertraulichen Informationen zu löschen, aber die Befehle, die die Informationen enthalten, beizubehalten. Dazu können Sie einfach vertrauliche Informationen durch einen Ersatztext Ihrer Wahl ersetzen:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

Löschen Sie vertrauliche Informationen aus einer beliebigen Datei in einem bestimmten Baum

Um sicherzugehen, dass dies nicht in einer anderen vergessenen Datei bleibt :

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

listet alle betroffenen Dateien auf.

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

Ersetzt alle Vorkommen vertraulicher Informationen in allen Dateien in der Verzeichnisstruktur, die unter verwurzelt ist .. Hinweis: Auch wenn dieser Befehl verwendet wird xargs -0, werden Dateien mit Zeilenumbrüchen in ihren Namen nicht verarbeitet.


11

Suchen Sie die zu löschende Zeile, indem Sie so oft drücken, ↑ (up arrow)bis sie angezeigt wird, und drücken Sie dann Ctrl+ U. Das sollte die Linie entfernen.

Wenn Sie den historyBefehl verwenden, können Sie sehen, dass die Zeile durch ein Sternchen ersetzt wurde.


2
Eigentlich glaube ich, dass Sie den Cursor auf die Zeile setzen müssen, Strg + U drücken und dann auf oder ab zu einer anderen Zeile gehen müssen (möglicherweise der leere am Ende der Liste). Streng genommen wurde die Zeile auch nicht durch ein Sternchen ersetzt. Vielmehr wurde der Befehl gelöscht und der Verlaufsnummer wurde ein angefügt *.
G-Man

1
Dies wird mit Strg + R (umgekehrte inkrementelle Verlaufssuche) viel leistungsfähiger, als zB [Ende], Strg + U
sehen am

4

Wenn Sie mehrere Zeilen gleichzeitig entfernen müssen, verwende ich normalerweise Folgendes:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

Wenn Sie den letzten Befehl entfernen müssen, können Sie Folgendes verwenden:

history -d $((HISTCMD-2))

2
Dies sah so aus, als hätte es funktioniert, history | grep <string>zeigt aber immer noch alle Zeilen, die es zu löschen behauptet ...
Brock Hensley

1
Dies löscht die falschen Verlaufszeilen nach dem Löschen des ersten !!
Mivk

1
Zum Glück werden nur die falschen Löschbefehle ausgegeben. Folgendes würde die korrekten Löschbefehle history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
ausgeben

3

Wenn Sie mehrere Zeilen aus dem Verlauf entfernen müssen, können Sie mit der folgenden Bash-Funktion Zeit sparen:

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

Funktion sollte normalerweise hinzugefügt werden $HOME/.bashrc. Um die Funktion sofort nutzen zu können, muss die Datei von Ihrer laufenden Shell ( . $HOME/.bashrc) erneut gelesen werden . So löschen Sie zB die Befehle 200-210 aus dem Verlauf:

$ histdel 200 210

(Hinweis: Diese Frage gehört zu den Top-Suchergebnissen, wenn Sie nach dem Löschen einer Reihe von Befehlen aus dem Bash-Verlauf suchen. Das oben Gesagte ist zwar mehr als das, was die Frage verlangt, kann jedoch für einige Leser nützlich sein.)


3
Alternative Formen für die forAussage: for n in $(seq "$2" "$1")wird von einigen stilistisch bevorzugt, und wenn seqes nicht funktioniert, versuchen Sie es for ((n="$2"; n>="$1"; n--)).
Scott

3
history | sed -i 59d

59 ist die Zeilennummer. Kann nichts süßeres sein als das :)


3

Probieren Sie diese aus,

$ history

Dadurch werden die ID des Verlaufs und der Befehl angezeigt, z

.
.
211 ls
212 javac Welcome.java
213 java welcome
.
.

verwenden,

$ history -d 211

Hier ist 211 die ID der Geschichte. Überprüfen Sie dies nun mit

$ history

.
.
211 javac Welcome.java
212 java welcome
.
.


2

Ich weiß, dass es lange her ist, dass diese Frage gestellt und beantwortet wurde, aber ich zeige Ihnen meine Methode, um meine Verlaufsdatei zu bereinigen und mich gleichzeitig abzumelden.

Ich renne : history -w && nano "${HISTFILE}" && history -c && exit

Was es tut, ist einfach:

  1. history -w : schreibt die zwischengespeicherte Geschichte hinein "${HISTFILE}"
  2. nano "${HISTFILE}": Gestatten Sie mir bearbeiten Sie "${HISTFILE}"Ihre Man könnte einen Sed - Skript verwenden , oder was auch immer Ihr wollen reinigen"${HISTFILE}"
  3. history -c : Cache-Verlauf löschen, damit dieser letzte Befehl nicht angehängt wird.
  4. exit : melde mich ab und füge den zwischengespeicherten Verlauf hinzu ... aber er ist leer;)

Nach diesem Befehl werden Sie mit einer sauberen Verlaufsdatei abgemeldet. Loggen Sie sich ein, um Ihren Verlauf zu überprüfen;)

Ich hoffe das hilft jemandem.


1

Sie können die Verlaufsdatei auch direkt bearbeiten, z. B. nano .bash_historywenn Sie sich in der Bash-Shell befinden.

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.