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

Rimuovere una certa linea dal file di cronologia di Bash

Come posso rimuovere una certa linea dal database di history?

Risposte (12)

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

Potete ottenere la rimozione dal file della cronologia usando la riga di comando in due passi:

  1. Digitando history -d <line_number> si cancella una linea specificata dalla cronologia in memoria.
  2. Digitando history -w si scrive la cronologia corrente in memoria nel file ~/.bash_history.

I due passi insieme rimuovono la linea in modo permanente dalla history in memoria e anche dal file .bash\history.

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

Dovete fare il logout e rientrare o eseguire history -a in modo che la cronologia corrente sia impegnata sul disco.

Poi basta modificare il file ~/.bash_history.

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

Per prevenire che un comando venga aggiunto alla cronologia, assicuratevi che la variabile d'ambiente HISTCONTROL contenga tra i suoi valori separati da due punti il valore ignorespace, per esempio (aggiungete e.g. a .bashrc):

$ export HISTCONTROL=ignorespace

Questo impedirà che qualsiasi comando con uno spazio iniziale venga aggiunto alla cronologia. Potete poi cancellare completamente la cronologia eseguendo

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

Prima di tutto, se il comando che state per dare è sensibile, non sicuro, o semplicemente non avete bisogno che ingombri la vostra cronologia, è meglio/più veloce evitare che entri nella cronologia in primo luogo. Assicuratevi che $HISTCONTROL contenga ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Poi procedi con qualsiasi comando che non vuoi nella tua cronologia con uno spazio:

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

Se accidentalmente metti un comando indesiderato nella cronologia, a condizione che la tua sessione bash sia ancora aperta, il comando non ha ancora toccato il disco. Per cancellare il comando precedente nella cronologia, emetti:

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

Nota lo spazio iniziale; questo comando richiede ignorespace, altrimenti si cancellerà da solo!

Se vuoi cancellare gli ultimi comandi, trova l'ultimo e il primo numero della cronologia:

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


In questo caso 602 e 599. Poi rilasciate: 

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

(Senza ignorespace, sarebbe 603..599.)

Se non volete che nessuna storia della vostra sessione corrente colpisca il disco, uscite usando:

(bash)$ kill -9 $$

L'approccio finora è di non lasciare nemmeno che gli elementi sensibili della cronologia siano scritti sul disco per maggiore sicurezza, perché in teoria i dati cancellati da supporti non volatili possono ancora essere recuperati.

Se, tuttavia, il comando o i comandi che volete rimuovere provengono da una sessione precedente, saranno già stati aggiunti allo $HISTFILE all'uscita. Manipolare la cronologia con i comandi di cui sopra continuerà ad applicare solo i rimanenti nuovi elementi allo $HISTFILE, all'uscita. Per sovrascrivere lo $HISTFILE con la vista della sessione corrente dell'intera storia, in questo momento, emetti:

(bash)$ history -w

Naturalmente per gli elementi della storia già sul disco, l'alternativa alla modifica della storia con i comandi history -d e poi emettendo history -w, è di modificare lo $HISTFILE con un editor di testo.t-work 602 otherwise-unwanted ”`

In questo caso 602 e 599. Poi rilasciate:

0x1&

(Senza 0x6&, sarebbe 603..599.)

Se non volete che nessuna storia della vostra sessione corrente colpisca il disco, uscite usando:

0x1&

L'approccio finora è di non lasciare nemmeno che gli elementi sensibili della cronologia siano scritti sul disco per maggiore sicurezza, perché in teoria i dati cancellati da supporti non volatili possono ancora essere recuperati.

Se, tuttavia, il comando o i comandi che volete rimuovere provengono da una sessione precedente, saranno già stati aggiunti allo 0x6& all'uscita. Manipolare la cronologia con i comandi di cui sopra continuerà ad applicare solo i rimanenti nuovi elementi allo 0x6&, all'uscita. Per sovrascrivere lo 0x6& con la vista della sessione corrente dell'intera storia, in questo momento, emetti:

0x1&

Naturalmente per gli elementi della storia già sul disco, l'alternativa alla modifica della storia con i comandi 0x6& e poi emettendo 0x6&, è di modificare lo 0x6& con un editor di testo.

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

Diverse tecniche:

Impedire che informazioni sensibili vengano memorizzate nel file della cronologia

Se avete inserito una password su una linea di comando, poi vi rendete conto che tutti i comandi sono registrati, potreste o:

  1. Uscire forzatamente dalla sessione corrente senza salvare la cronologia:

  2. Digitare ↑ (freccia su) nella sessione di bash aperta fino a quando le informazioni sensibili vengono mostrate, quindi utilizzare le sequenze di tasti di modifica della riga come Ctrl+W per cancellare le informazioni sensibili, e poi ↓ (freccia giù) fino a quando viene richiesta una nuova riga vuota, prima di digitare Invio.

Elimina le informazioni sensibili dal file della cronologia

Se ti accorgi che le informazioni sensibili sono già memorizzate, e vuoi cancellarle, ma non la tua intera cronologia:

Un semplice comando sed potrebbe fare il lavoro:

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

ma, mentre lo digitate, create un'altra linea della cronologia contenente il modello di ricerca (informazioni sensibili) che state cercando di cancellare. Quindi potreste:

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

Questo eseguirà head -n1 con input dal terminale. Sembrerà che il vostro terminale sia bloccato (non ci sarà un prompt); digitate semplicemente le informazioni che volete cancellare dal file. Questo è un trucco per permettervi di inserire (parte di) un comando senza effettivamente digitarlo nella linea di comando, rendendolo così ineleggibile per l'inclusione nel record della storia. Quindi sed userà il testo che hai digitato per cercare .bash_history e cancellare tutte le linee che contengono le informazioni sensibili. Nota: se il tuo pattern di informazioni sensibili contiene slash(e), devi fare l'escape con backslash, oppure cambiare il comando sed per usare questa sintassi per specificare un delimitatore che non appare nel pattern:

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

Un altro modo potrebbe essere quello di cancellare solo le informazioni sensibili, ma mantenere i comandi che le contengono. Per questo, potresti semplicemente sostituire le informazioni sensibili con un testo sostitutivo di tua scelta:

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

Elimina le informazioni sensibili da qualsiasi file in un albero specifico

Infine, per essere sicuri che questo non resti in un altro file dimenticato:

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

elencherà tutti i file interessati.

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

sostituirà tutte le occorrenze delle informazioni sensibili in tutti i file nell'albero delle directory con radice a .. Nota: anche se questo comando usa xargs -0, non gestirà i file con newline nei loro nomi.

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

Individua la linea che vuoi cancellare premendo ↑ (freccia su) finché non appare, poi premi Ctrl+U. Questo dovrebbe rimuovere la linea.

Se usi il comando history, puoi vedere che la linea è stata sostituita da un asterisco.

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

Se avete bisogno di rimuovere diverse linee allo stesso tempo, di solito uso questo:

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

Se hai bisogno di rimuovere l'ultimo comando puoi usare:

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

Se avete bisogno di rimuovere un intervallo di linee dalla cronologia, la seguente funzione bash potrebbe farvi risparmiare del tempo:

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
}

La funzione dovrebbe essere tipicamente aggiunta a $HOME/.bashrc. Per usare la funzione immediatamente, dovrete far leggere di nuovo il file dalla vostra shell in esecuzione (. $HOME/.bashrc). Poi per cancellare ad esempio i comandi 200-210 dalla cronologia:

$ histdel 200 210

(Nota: Questa domanda è tra i primi risultati di ricerca se si cerca di cancellare una serie di comandi dalla cronologia di bash. Quindi, anche se quanto sopra è più di quello che la domanda chiede, potrebbe essere utile per alcuni lettori).

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

Provate questi,

$ history

questo mostrerà l'id della storia e il comando, per esempio

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

use,

$ history -d 211

Here 211 is the id of the history. Ora controllate questo usando

$ history

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

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

59 è il numero di linea. Non può esserci niente di più dolce di questo :)

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

So che è passato molto tempo da quando questa domanda è stata fatta e ha avuto risposta, ma vi mostrerò il mio metodo per pulire il mio file di cronologia e fare il logout allo stesso tempo.

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

Quello che fa è semplice:

  1. history -w : scrive la cronologia memorizzata nella cache dentro "${HISTFILE}"
  2. nano "${HISTFILE}" : mi permette di modificare "${HISTFILE}" Puoi usare uno script sed o qualsiasi cosa tu voglia per pulire il tuo "${HISTFILE}"
  3. history -c : cancella la cronologia nella cache in modo che quest'ultimo comando non sia aggiunto.
  4. exit : log me out aggiungendo la cronologia memorizzata… ma è vuota ;)

Dopo questo comando, sarai disconnesso con un file di cronologia pulito. Accedi per controllare la tua cronologia ;)

Spero che questo possa aiutare qualcuno.

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

Potresti anche modificare direttamente il file di cronologia, ad esempio nano .bash_history se sei nella shell bash?