2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152

Eine bestimmte Zeile aus der Bash-History-Datei entfernen

Wie kann ich eine bestimmte Zeile aus der Datenbank von history entfernen?

Antworten (12)

152
152
152
2012-01-31 16:09:25 +0000

Sie können das Entfernen aus der Verlaufsdatei über die Befehlszeile in zwei Schritten erreichen:

  1. Die Eingabe von history -d <line_number> löscht eine angegebene Zeile aus der Historie im Speicher.
  2. Durch Eingabe von history -w wird der aktuelle Verlauf im Speicher in die Datei ~/.bash_history geschrieben.

Die beiden Schritte zusammen entfernen die Zeile dauerhaft aus der speicherinternen History und auch aus der Datei .bash_history.

118
118
118
2012-01-31 16:01:05 +0000

Sie müssen sich ab- und wieder anmelden oder history -a ausführen, damit der aktuelle Verlauf auf die Festplatte übertragen wird.

Bearbeiten Sie dann einfach die Datei ~/.bash_history.

41
41
41
2012-02-01 22:19:06 +0000

Um zu verhindern, dass ein Befehl überhaupt in den Verlauf aufgenommen wird, stellen Sie sicher, dass die Umgebungsvariable HISTCONTROL unter ihren durch Doppelpunkte getrennten Werten den Wert ignorespace enthält, z. B. (fügen Sie z. B. zu .bashrc hinzu):

$ export HISTCONTROL=ignorespace

Dies verhindert, dass ein Befehl mit einem führenden Leerzeichen in den Verlauf aufgenommen wird. Sie können dann die Historie vollständig löschen, indem Sie

$ history -c -w
  ^-- additional space character
33
33
33
2013-06-18 16:33:19 +0000

Zuallererst, wenn der Befehl, den Sie ausgeben wollen, sensibel oder unsicher ist, oder wenn Sie einfach nicht wollen, dass er Ihren Verlauf durcheinander bringt, ist es am besten/schnellsten, ihn einfach daran zu hindern, überhaupt in den Verlauf zu gelangen. Stellen Sie sicher, dass $HISTCONTROL ignorespace enthält:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Dann fügen Sie jeden Befehl, den Sie nicht in der History haben wollen, mit einem 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 die History stellen, hat der Befehl, sofern Ihre Bash-Sitzung noch geöffnet ist, noch nicht die Platte berührt. Um den vorherigen Befehl in der History zu löschen, geben Sie ein:

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

Beachten Sie das führende Leerzeichen; dieser Befehl benötigt ignorespace, sonst löscht er sich einfach selbst!

Wenn Sie die letzten paar Befehle löschen wollen, suchen Sie die letzte und erste History-Nummer:

(bash)$ history 5
  598 ok
  599 sensitive
  600 unsafe
  601 doesn 

In diesem Fall 602 und 599. Geben Sie dann aus: 

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

(Ohne ignorespace wäre es 603..599.)

Wenn Sie nicht wollen, dass irgendein Verlauf aus Ihrer aktuellen Sitzung auf die Festplatte gelangt, beenden Sie mit:

(bash)$ kill -9 $$

Der bisherige Ansatz ist, zur zusätzlichen Sicherheit nicht einmal sensible Verlaufsdaten auf die Festplatte schreiben zu lassen, da theoretisch Daten, die von nichtflüchtigen Medien gelöscht wurden, immer noch wiederhergestellt werden können.

Wenn die Befehle, die Sie entfernen möchten, jedoch aus einer früheren Sitzung stammen, wurden sie beim Beenden bereits an das $HISTFILE angehängt. Wenn Sie die Historie mit den oben genannten Befehlen manipulieren, werden trotzdem nur die verbleibenden neuen Elemente an $HISTFILE angehängt, beim Beenden. Um die $HISTFILE mit der Ansicht der aktuellen Sitzung der gesamten Historie zu überschreiben, jetzt, geben Sie ein:

(bash)$ history -w

Natürlich ist die Alternative zum Bearbeiten der Historie mit history -d-Befehlen und dem anschließenden Ausgeben von history -w das Bearbeiten der $HISTFILE mit einem Texteditor, wenn sich die Historie bereits auf der Festplatte befindet.t-work 602 otherwise-unwanted ”`

In diesem Fall 602 und 599. Geben Sie dann aus:

0x1&

(Ohne 0x6& wäre es 603..599.)

Wenn Sie nicht wollen, dass irgendein Verlauf aus Ihrer aktuellen Sitzung auf die Festplatte gelangt, beenden Sie mit:

0x1&

Der bisherige Ansatz ist, zur zusätzlichen Sicherheit nicht einmal sensible Verlaufsdaten auf die Festplatte schreiben zu lassen, da theoretisch Daten, die von nichtflüchtigen Medien gelöscht wurden, immer noch wiederhergestellt werden können.

Wenn die Befehle, die Sie entfernen möchten, jedoch aus einer früheren Sitzung stammen, wurden sie beim Beenden bereits an das 0x6& angehängt. Wenn Sie die Historie mit den oben genannten Befehlen manipulieren, werden trotzdem nur die verbleibenden neuen Elemente an 0x6& angehängt, beim Beenden. Um die 0x6& mit der Ansicht der aktuellen Sitzung der gesamten Historie zu überschreiben, jetzt, geben Sie ein:

0x1&

Natürlich ist die Alternative zum Bearbeiten der Historie mit 0x6&-Befehlen und dem anschließenden Ausgeben von 0x6& das Bearbeiten der 0x6& mit einem Texteditor, wenn sich die Historie bereits auf der Festplatte befindet.

17
17
17
2013-07-19 12:50:40 +0000

Verschiedene Techniken:

Verhindern, dass sensible Informationen in der Verlaufsdatei gespeichert werden

Wenn Sie in einer Befehlszeile ein Passwort eingegeben haben und dann feststellen, dass alle Befehle protokolliert werden, können Sie entweder:

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

  2. Geben Sie in der geöffneten Bash-Sitzung ↑ (Pfeil nach oben) ein, bis die sensiblen Informationen angezeigt werden, verwenden Sie dann Zeilenbearbeitungstasten wie Strg+W, um die sensiblen Informationen zu löschen, und dann ↓ (Pfeil nach unten), bis eine neue leere Zeile angezeigt wird, bevor Sie Enter eingeben.

Löschen sensibler Informationen aus der Verlaufsdatei

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

Ein einfacher sed-Befehl könnte die Aufgabe erledigen:

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

, aber während Sie dies eingeben, erstellen Sie eine weitere Verlaufszeile, die das Suchmuster (sensible Informationen) enthält, das Sie zu löschen versuchen. Sie könnten also:

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

Dies wird head -n1 mit einer Eingabe vom Terminal ausführen. Es wird so aussehen, als ob Ihr Terminal hängt (es wird keine Eingabeaufforderung angezeigt); geben Sie einfach die Informationen ein, die Sie aus der Datei löschen wollen. Dies ist ein Trick, damit Sie (einen Teil) eines Befehls eingeben können, ohne ihn tatsächlich in die Befehlszeile zu tippen, so dass er nicht in den Verlaufsdatensatz aufgenommen werden kann. Dann wird sed den von Ihnen eingegebenen Text verwenden, um .bash_history zu durchsuchen und alle Zeilen zu löschen, die die vertraulichen Informationen enthalten. Hinweis: Wenn Ihr Muster für vertrauliche Informationen Schrägstriche enthält, müssen Sie diese mit Backslashes entwerten oder den Befehl sed so ändern, dass er diese Syntax verwendet, um ein Trennzeichen anzugeben, das nicht im Muster vorkommt:

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

Eine andere Möglichkeit wäre, nur die vertraulichen Informationen zu löschen, aber die Befehle zu behalten, die die Informationen enthalten. Dazu könnten Sie einfach die sensitiven Infos durch einen Ersatztext Ihrer Wahl ersetzen:

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

Löschen Sie sensitive Informationen aus jeder Datei in einem bestimmten Baum

Schließlich, um sicher zu sein, dass diese nicht in einer anderen vergessenen Datei bleiben:

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

wird alle betroffenen Dateien auflisten.

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 der sensiblen Information in allen Dateien im Verzeichnisbaum, der bei . wurzelt. Hinweis: Obwohl dieser Befehl xargs -0 verwendet, behandelt er keine Dateien mit Zeilenumbrüchen in ihren Namen.

12
12
12
2015-04-01 16:00:26 +0000

Suchen Sie die Zeile, die Sie löschen möchten, indem Sie ↑ (Pfeil nach oben) drücken, bis sie erscheint, und drücken Sie dann Strg+U. Das sollte die Zeile entfernen.

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

5
5
5
2013-01-07 05:53:04 +0000

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 verwenden:

history -d $((HISTCMD-2))
3
3
3
2012-10-26 14:09:51 +0000

Wenn Sie einen Bereich von Zeilen aus der Historie entfernen müssen, könnte Ihnen die folgende Bash-Funktion etwas Zeit ersparen:

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 typischerweise an $HOME/.bashrc angehängt werden. Um die Funktion sofort nutzen zu können, müssen Sie die Datei von Ihrer laufenden Shell neu einlesen lassen (. $HOME/.bashrc). Um dann z.B. die Befehle 200-210 aus der Historie zu löschen:

$ histdel 200 210

(Hinweis: Diese Frage ist unter den Top-Suchergebnissen, wenn Sie nach dem Löschen einer Reihe von Befehlen aus der Bash-History suchen. Obwohl das obige also mehr ist, als die Frage verlangt, könnte es für einige Leser nützlich sein).

3
3
3
2014-03-04 11:16:04 +0000

Probieren Sie einfach folgendes aus:

$ history

Dies zeigt die ID der History und den Befehl an, z.B.

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

Verwenden Sie,

$ history -d 211

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

$ history

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

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

59 ist die Zeilennummer. Es kann nichts Schöneres geben als das :)

2
2
2
2015-09-30 04:57:29 +0000

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

Ich führe :history -w && nano "${HISTFILE}" && history -c && exit

aus. Was es tut, ist einfach:

  1. history -w : schreibt den zwischengespeicherten Verlauf in "${HISTFILE}"
  2. nano "${HISTFILE}" : erlaubt mir, "${HISTFILE}" zu bearbeiten. Sie könnten ein sed-Skript oder was auch immer verwenden, um Ihr "${HISTFILE}" zu reinigen. 3. history -c : zwischengespeicherte Historie löschen, damit dieser letzte Befehl nicht angehängt wird.
  3. exit : logge mich aus und hänge den gecachten Verlauf an… aber er ist leer ;)

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

Ich hoffe, dass dies jemandem helfen wird.

1
1
1
2017-03-27 14:10:10 +0000

Sie könnten die History-Datei auch direkt bearbeiten, z. B. nano .bash_history, wenn Sie sich in der Bash-Shell befinden?