Esiste un modo per impedire che un comando venga aggiunto alla tua cronologia?


65

Esiste un modo per impedire che un comando venga aggiunto alla tua cronologia? Ho un comando che voglio tenere fuori dal mio file di cronologia e non mi interessa davvero averlo lì quando cerco la cronologia memorizzata in memoria, anche se questo è meno preoccupante. C'è un modo per impedirlo o devo solo tornare indietro e modificare il mio file di cronologia.

aggiornamento: non avevo capito che questo potrebbe essere specifico della shell. La mia shell è zsh. Puoi rispondere per altre shell in modo che le persone sappiano come farlo nella shell.


collegamento incrociato alla risposta zsh: superuser.com/questions/352788/…
Michael Shigorin,

Risposte:


52

In ZSH :

Prima inserisci setopt HIST_IGNORE_SPACEnel tuo ~/.zshrc. Ora dopo aver effettuato nuovamente l'accesso, puoi aggiungere un prefisso a tutti i comandi che non desideri vengano memorizzati nella cronologia space.

Dal manuale utente , le seguenti 3 opzioni possono essere usate per dire che certe righe non dovrebbero entrare nella storia:

  • HIST_IGNORE_SPACE non memorizza comandi con prefisso con uno spazio
  • HIST_NO_STORE non memorizza il comando history ( fc -l )
  • HIST_NO_FUNCTIONS non memorizza le definizioni delle funzioni

qualche possibilità che la risposta di @mmckinst funzioni in zsh? o qualcosa del genere? o forse qualsiasi comando che includa il comando| somecommand
xenoterracide

AFAIK non esiste un equivalente di HISTIGNORE di bash in zsh.
dogbane,

@xeno zsh fornisce una funzione hook preexecche può essere utilizzata per questo. Se restituisce un valore diverso da zero, il comando non viene salvato nella cronologia.
Keith,

1
per fare in modo che zsh ignori un gruppo di comandi comuni di base, li aliasi tutti per avere uno spazio davanti ... per c (i lavori fs bg escono da reset chiaro); fare alias $ c = "$ c"; fatto
Will Norris,

4
Per i futuri lettori pigri come me che non sanno ancora come farlo: setopt HIST_IGNORE_SPACEin~/.zshrc
Al.G.

25

Se si esegue ripetutamente il comando, è possibile che si desideri utilizzare la funzione ignora cronologia della shell. Supponiamo che tu abbia secret.server.com a cui ssh, file FTP, ecc. Che non desideri salvare alcuna riga che menziona secret.server.com:

In bashte impostare

HISTIGNORE="*secret.server.com*"

mentre nel zshparametro viene chiamato

HISTORY_IGNORE="*secret.server.com*"

È possibile elencare più motivi con i due punti che li separano. Si noti che ogni modello è abbinato all'intera riga di input , quindi potrebbe essere necessario includere un *. Ad esempio, quanto segue escluderà fortunedalla cronologia, ma memorizzerà fortune -l:

HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*:ytalk*:fortune"

Con HISTIGNORE impostato, nulla che corrisponda ai motivi che elenchi verrà salvato in .bash_history/ .zsh_historye anche il tasto freccia su, che normalmente richiama il comando precedente, non funzionerà se corrisponde al motivo.


3
qualche possibilità che funzioni in zsh?
xenoterracide,

C'è un'opzione per ignorare solo le linee che iniziano con la fortuna. Qualcosa come HISTIGNORE="^fortune*"ignorare fortune -lma mantenere myfortune?
Bernhard,

@xenoterracide Lo fa, ma il parametro è chiamato diversamente. L'ho appena modificato nella risposta.
n.

23

In bash, usa la HISTCONTROLvariabile.

Impostalo su HISTCONTROL=ignorespace(o HISTCONTROL=ignoreboth). Da adesso, quando inizi una linea con uno spazio , questa non verrà salvata nella cronologia. Ciò evita di includere il comando da non divulgare in alcuni file di configurazione.

Anche così capita di dimenticare di aggiungere lo spazio e quindi voler tornare indietro. Per eliminare una voce nella cronologia, utilizzare history -d <index>, con indexil numero trovato con il historycomando (prima colonna).


1
Questo funziona in zsh?
Gert,

11

Il modo più semplice per una tantum è

$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$

dove $rappresenta il prompt della shell iniziale e $$rappresenta il prompt della subshell. Questo funziona in bash e zsh; in ksh devi HISTFILE=/notwritableinvece. Si noti che ciò che conta è il valore di HISTFILEquando viene scritto il file di cronologia, non quando viene eseguito il comando. Bash, ksh e zsh scrivono nel file della cronologia quando escono (zsh può farlo più spesso a seconda della configurazione).

In alternativa, puoi ottenere bash o zsh per ignorare le linee che corrispondono a determinati schemi (questo è già coperto da altre risposte).

Un'altra possibilità in zsh è

% fc -p
% secret-command
% fc -P

fc -pinserisce l'elenco della cronologia corrente in uno stack e ne avvia uno nuovo non associato a un file di salvataggio. fc -Pfa apparire la cronologia non salvata dalla pila e se ne dimentica del tutto.

Mentre un processo è in esecuzione, il comando e i suoi argomenti (e su alcuni sistemi anche il suo ambiente) verranno visualizzati nella tabella dei processi ( psoutput). La radice può vedere i comandi passati nel database di contabilità di sistema e può fare più registrazioni senza il tuo controllo. E probabilmente ci saranno tutti i tipi di prove forensi che possono mostrare all'incirca quale comando hai eseguito (come i tempi di modifica dei file). Quindi non ottieni privacy contro determinati intercettatori.

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.