Rimuovere una certa linea dal file di cronologia di Bash
Come posso rimuovere una certa linea dal database di history
?
Come posso rimuovere una certa linea dal database di history
?
Potete ottenere la rimozione dal file della cronologia usando la riga di comando in due passi:
history -d <line_number>
si cancella una linea specificata dalla cronologia in memoria. 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.
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
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.
Diverse tecniche:
Se avete inserito una password su una linea di comando, poi vi rendete conto che tutti i comandi sono registrati, potreste o:
Uscire forzatamente dalla sessione corrente senza salvare la cronologia:
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.
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.
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.
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.
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).
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 . .
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:
history -w
: scrive la cronologia memorizzata nella cache dentro "${HISTFILE}"
nano "${HISTFILE}"
: mi permette di modificare "${HISTFILE}"
Puoi usare uno script sed o qualsiasi cosa tu voglia per pulire il tuo "${HISTFILE}"
history -c
: cancella la cronologia nella cache in modo che quest'ultimo comando non sia aggiunto. 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.