Antworten:
Sie müssen sich abmelden und wieder anmelden oder ausführen, history -a
damit der aktuelle Verlauf auf der Festplatte gespeichert wird.
Dann bearbeiten Sie einfach die Datei ~/.bash_history
.
vim ~/.bash_history
) mit einem Leerzeichen; Befehle, die mit einem Leerzeichen beginnen, werden normalerweise nicht protokolliert (siehe $HISTCONTROL
).
Sie können das Entfernen aus der Verlaufsdatei mithilfe der Befehlszeile in zwei Schritten erreichen:
history -d <line_number>
Eingabe wird eine bestimmte Zeile aus dem Verlauf im Speicher gelöscht.history -w
der aktuelle Verlauf im Arbeitsspeicher in die ~/.bash_history
Datei geschrieben.Durch die beiden Schritte wird die Zeile dauerhaft aus dem speicherinternen Verlauf und auch aus der Datei .bash_history entfernt .
history -w
aus der Geschichte?
<line_number>
nur history | grep [unwanted_content]
eine Liste mit allen Zeilen zu finden, die [unwanted_content]
(wie Passwörter) enthalten.
Um zu verhindern einen Befehl hinzugefügt , um die Geschichte in erster Linie, stellen Sie sicher , dass der Umgebungsvariable HISTCONTROL
enthä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
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 $HISTCONTROL
enthalten 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 ignorespace
wä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 $HISTFILE
On-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 -d
Befehlen, die dann ausgegeben werden history -w
, darin, den Verlauf $HISTFILE
mit einem Texteditor zu bearbeiten .
$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.
Mehrere Techniken:
Wenn Sie ein Kennwort in eine Befehlszeile eingegeben haben, stellen Sie fest, dass alle Befehle protokolliert werden. Sie können entweder:
Beenden der aktuellen Sitzung erzwingen, ohne den Verlauf zu speichern:
kill -9 $$
Dadurch wird der gesamte aktuelle Verlauf gelöscht.
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.
Wenn Sie feststellen, dass vertrauliche Informationen bereits gespeichert sind und Sie diese löschen möchten, jedoch nicht Ihren gesamten Verlauf:
Ein einfacher sed
Befehl 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 -n1
mit 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 sed
wird 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 sed
Befehl 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.
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.
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 history
Befehl verwenden, können Sie sehen, dass die Zeile durch ein Sternchen ersetzt wurde.
*
.
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))
history | grep <string>
zeigt aber immer noch alle Zeilen, die es zu löschen behauptet ...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
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.)
for
Aussage: for n in $(seq "$2" "$1")
wird von einigen stilistisch bevorzugt, und wenn seq
es nicht funktioniert, versuchen Sie es for ((n="$2"; n>="$1"; n--))
.
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
.
.
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:
history -w
: schreibt die zwischengespeicherte Geschichte hinein "${HISTFILE}"
nano "${HISTFILE}"
: Gestatten Sie mir bearbeiten Sie "${HISTFILE}"
Ihre Man könnte einen Sed - Skript verwenden , oder was auch immer Ihr wollen reinigen"${HISTFILE}"
history -c
: Cache-Verlauf löschen, damit dieser letzte Befehl nicht angehängt wird.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.