Nascondi "history -d" nella storia di bash


14

Se digito accidentalmente la mia password o qualsiasi altra cosa sensibile in bash posso facilmente rimuovere quella riga con history -d ROW#, ma rimango sempre con il history -d ROW#comando nella cronologia che mostra a tutti che qualcuno ha corretto un errore.

Posso aggiungere qualcosa a un comando per impedire che appaia nella cronologia di bash?

Risposte:


27

Per non salvare un singolo comando nella tua cronologia basta precederlo con uno spazio (contrassegnato da qui):

$ 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

Questo comportamento è impostato nel tuo ~/.bashrcfile, in particolare in questa riga:

HISTCONTROL=ignoreboth

man bash dice:

HISTCONTROL
Un elenco di valori separati da due punti che controllano il modo in cui i comandi vengono salvati nell'elenco della cronologia. Se l'elenco di valori include ignorespace , le righe che iniziano con un carattere spazio non vengono salvate nell'elenco cronologico . Un valore di ignoredups fa sì che le righe corrispondenti alla voce della cronologia precedente non vengano salvate. Un valore di ignoreboth è una scorciatoia per ignorespace e ignoredups .

ignoredupsa proposito è il motivo per cui history | tail -n2appare solo una volta nella storia nel test sopra.


La cronologia di un terminale viene salvata nella RAM e scaricata nel tuo ~/.bash_historyappena chiudi il terminale. Se desideri eliminare una voce specifica dalla tua ~/.bash_historypuoi farlo con 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

Nell'ultimo ho modificato il delimitatore predefinito /in _come viene utilizzato all'interno del termine di ricerca, in effetti è uguale a sed -i '/\/path\//d' .bash_history. Se il comando genera solo le righe che si desidera eliminare, aggiungere l' -iopzione e modificare !din dper eseguire la cancellazione:

                                   # 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

12

Un modo sarebbe quello di impostare la HISTIGNOREvariabile d'ambiente. A partire dalman 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, è l'impostazione predefinita HISTCONTROLche fornisce la soluzione alternativa del tipo a spazio nello spazio frontale].

Quindi, per esempio

HISTIGNORE='history -d*'

Se vuoi che sia persistente, esportalo dal tuo ~/.bashrc

export HISTIGNORE='history -d*'

6

Puoi

  • Chiudere le finestre dei terminali . Questo scaricherà la cronologia più recente nella finestra del terminale che si chiude più tardi (dopo la chiusura delle altre finestre) nel file/home/$USER/.bash_history

  • Modifica il file/home/$USER/.bash_history senza coinvolgere bash, ad esempio avviando il tuo editor preferito tramite Alt+F2

    In questo modo è possibile ispezionare l'intera cronologia e rimuovere qualsiasi comando che non si desidera più essere lì.

    inserisci qui la descrizione dell'immagine

    inserisci qui la descrizione dell'immagine


1

Di solito uso:

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

Il file di cronologia viene scritto su disco, cancellato in memoria, lo si modifica per fare ciò che si desidera e quindi il file di cronologia modificato viene riletto.

Si noti che se l'editor salva i file di backup, la parola birichina potrebbe ancora apparire sul disco.

Un'altra opzione da utilizzare -dè utilizzare i numeri cronologici predittivi:

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 questo esempio, elimino la cosa negativa, elimino il comando per ottenere il numero di cronologia e quindi elimino il comando che ho usato per eliminare la cronologia. Allora tutto è sanificato.


0

Se si desidera eseguire un comando senza salvarlo nella cronologia, anteprimerlo con uno spazio aggiuntivo

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

Perché ciò funzioni è necessario ignorare lo spazio o ignorare entrambi in HISTCONTROL. Ad esempio, esegui

HISTCONTROL = ignorespace Per rendere persistente questa impostazione, inseriscila nel tuo .bashrc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.