Verstecke "history -d" im Bash-Verlauf

14

Wenn ich versehentlich mein Passwort oder etwas anderes vertrauliches in bash eingebe, kann ich diese Zeile leicht entfernen history -d ROW#, aber ich behalte immer den history -d ROW#Befehl im Verlauf, der allen anzeigt, dass jemand einen Fehler korrigiert hat.

Kann ich einem Befehl etwas anhängen, um zu verhindern, dass er im Bash-Verlauf angezeigt wird?

Kalle Ling
quelle

Antworten:

27

Um einen einzelnen Befehl in Ihrem Verlauf nicht zu speichern, müssen Sie ihm lediglich ein Leerzeichen voranstellen (hier markiert ):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

Dieses Verhalten wird in Ihrer ~/.bashrcDatei festgelegt, und zwar in der folgenden Zeile:

HISTCONTROL=ignoreboth

man bash sagt:

HISTCONTROL
Eine durch Doppelpunkte getrennte Liste von Werten, die steuern, wie Befehle in der Verlaufsliste gespeichert werden. Wenn die Werteliste Unbeachtung enthält , werden Zeilen, die mit einem Leerzeichen beginnen, nicht in der Verlaufsliste gespeichert . Ein Wert von ignoredups bewirkt, dass Zeilen, die mit dem vorherigen Verlaufseintrag übereinstimmen, nicht gespeichert werden. Ein Wert von ignoreboth ist eine Abkürzung für ignorespace und ignoredups .

ignoredupsübrigens ist der grund warum history | tail -n2im obigen test nur einmal in der geschichte auftaucht.


Der Verlauf eines Terminals wird im RAM gespeichert und nach dem ~/.bash_historySchließen des Terminals an Ihren Computer gesendet. Wenn Sie einen bestimmten Eintrag aus Ihrem löschen möchten, können ~/.bash_historySie dies tun mit sed:

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

In der letzten habe ich das Standardtrennzeichen /in geändert , _da es im Suchbegriff verwendet wird. Tatsächlich ist dies gleich sed -i '/\/path\//d' .bash_history. Wenn der Befehl nur die zu löschenden Zeilen ausgibt, fügen Sie die -iOption hinzu und ändern Sie !dsie d, um den Löschvorgang durchzuführen:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere
Dessert
quelle
12

Eine Möglichkeit wäre, die HISTIGNOREUmgebungsvariable festzulegen. Vonman bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW, dies ist die Standardeinstellung HISTCONTROL, die die Umgehung von Typ-A-Space-In-Front bereitstellt].

Also zum Beispiel

HISTIGNORE='history -d*'

Wenn Sie möchten, dass es dauerhaft bleibt, exportieren Sie es von Ihrem ~/.bashrc

export HISTIGNORE='history -d*'
Stahlfahrer
quelle
6

Du kannst

  • Schließen Sie die Terminalfenster . Dadurch wird der aktuellste Verlauf im Terminalfenster, den Sie zuletzt schließen (nachdem die anderen Fenster geschlossen wurden), in die Datei geschrieben/home/$USER/.bash_history

  • Bearbeiten Sie die Datei,/home/$USER/.bash_history ohne dass Sie etwas damit zu tun haben bash, indem Sie beispielsweise Ihren Lieblingseditor über Alt+ startenF2

    Auf diese Weise können Sie den gesamten Verlauf einsehen und alle Befehle entfernen, die Sie nicht mehr benötigen.

    Bildbeschreibung hier eingeben

    Bildbeschreibung hier eingeben

Sudodus
quelle
1

Ich benutze normalerweise:

history -w; history -c; $EDITOR $HISTFILE; history -r

Die Verlaufsdatei wird auf die Festplatte geschrieben, im Speicher gelöscht, Sie bearbeiten sie, um das zu tun, was Sie wollen, und dann wird die von Ihnen bearbeitete Verlaufsdatei wieder eingelesen.

Beachten Sie, dass beim Speichern von Sicherungsdateien durch den Editor das falsche Wort möglicherweise weiterhin auf der Festplatte angezeigt wird.

Eine weitere Option -dist die Verwendung von Vorhersageprotokollnummern:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

In diesem Beispiel lösche ich die schlechte Sache, lösche den Befehl zum Abrufen der Verlaufsnummer und lösche dann den Befehl, den ich zum Löschen des Verlaufs verwendet habe. Dann wird alles saniert.

Seth Robertson
quelle
0

Wenn Sie einen Befehl ausführen möchten, ohne ihn im Verlauf zu speichern, müssen Sie ihm ein zusätzliches Leerzeichen voranstellen

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Damit dies funktioniert, benötigen Sie entweder Ignoranz oder Ignoranz in HISTCONTROL. Führen Sie beispielsweise aus

HISTCONTROL = Ignoranz Um diese Einstellung dauerhaft zu erhalten, fügen Sie sie in Ihre .bashrc-Datei ein.

bkdroid13
quelle