Esegui comando senza tenerlo nella cronologia [chiuso]


203

Voglio eseguire alcuni comandi ma non voglio salvarli nella cronologia dei comandi. In modo che nessuno sarà in grado di cercarlo nel .bash_historyfile.

Esiste un modo per eseguire i comandi bash in questo modo?


13
Questa domanda dovrebbe probabilmente essere spostata su ServerFault in quanto non si tratta di "programmazione" quanto di "server admin" - ma grazie per la domanda / risposta, esattamente ciò di cui avevo bisogno!
Andrew Theken,

Risposte:


294

Inizia il tuo comando con uno spazio e non sarà incluso nella cronologia.

Tenere presente che ciò richiede l' $HISTCONTROLimpostazione della variabile di ambiente .

  • Verificare che il seguente comando restituisca ignorespaceo ignoreboth

    #> echo $HISTCONTROL
  • Per aggiungere la variabile d'ambiente se mancante, è possibile aggiungere la seguente riga al profilo bash. Per esempio%HOME/.bashrc

    export HISTCONTROL=ignorespace

Dopo aver acquisito nuovamente il profilo, i comandi con prefisso spaziale non verranno scritti $HISTFILE


20
Questo non funziona a meno che ignorespace sia incluso in $ HISTCONTROL - sebbene questo sia probabilmente il valore predefinito sulla maggior parte dei sistemi.
pgl

2
Corretta. Per maggiori dettagli l'OP dovrebbe dare un'occhiata a HISTCONTROL e HISTIGNORE nella pagina man di bash.
u-punkt,

2
thegeekstuff.com/2008/08/… - qui sono disponibili altri suggerimenti sulla storia di bash incluso questo metodo per nascondere i comandi dalla cronologia
user379997

52

In una determinata sessione di Bash, imposta il file della cronologia su / dev / null digitando:

export HISTFILE=/dev/null

Nota che, come sottolineato nei commenti, questo non scriverà alcun comando in quella sessione nella cronologia!

Basta non scherzare con il duro lavoro dell'amministratore di sistema, per favore;)

La soluzione di Doodad è più elegante. Basta disinserire la variabile: unset HISTFILE(grazie!)


5
Ciò impedirà la registrazione di tutti i comandi. Non è quello che vuole l'interrogante.
Noufal Ibrahim,

12
Ciò ha causato problemi per me relativi alle /dev/nullautorizzazioni impostate su 0600 al logout. Invece ho usato unset HISTFILE.
Doodad,


21

Un'estensione della risposta di @John Doe e @ user3270492. Ma questo sembra funzionare per me.

<your_secret_command>; history -d $((HISTCMD-1))

Non dovresti vedere la voce del comando nella tua cronologia.

Ecco la spiegazione ..

La 'storia -d' cancella la voce menzionata dalla storia.

HISTCMD memorizza il command_number di quello da eseguire successivamente. Quindi, (HISTCMD-1) si riferisce all'ultimo comando eseguito.

Rimuovi una determinata riga dal file della cronologia di Bash


Purtroppo questo non ha funzionato per me.
Magick,

10

Potresti considerare di usare una shell senza cronologia, come forse

/bin/sh << END
   your commands without history
END

(forse /bin/dasho /bin/sashpotrebbe essere più appropriato di /bin/sh)

o ancora meglio utilizzare l' utilità batch ad es

batch << EOB
   your commands
EOB

La storia conterrebbe quindi sho batchche non è molto significativo


8

Puoi iniziare la sessione con

export HISTFILE=/dev/null ;history -d $(history 1)

quindi procedi con le tue azioni subdole. L'impostazione del file hist /dev/nullverrà registrata nel file della cronologia, tuttavia questa voce verrà prontamente eliminata e non verrà visualizzata alcuna traccia (almeno nel file della cronologia).

Inoltre, questo non è permanente.


Questa era già una risposta molte volte. Cosa diresti che la tua risposta aggiunge a questa discussione (tranne che per il rumore inutile)?
gniourf_gniourf

Non è stato messo insieme in un'unica risposta , in modo da non mostrare il comando stesso nella storia e non mostrare nulla che sia entrato successivamente.
Christian

1
Ma ora questa discussione è un vero casino! in questo caso, specialmente per una domanda così vecchia, credo che sia meglio modificare le risposte già esistenti e / o lasciare un commento ...
gniourf_gniourf

5

Come accennato da Doodad nei commenti , lo unset HISTFILEfa bene, ma nel caso in cui desideri anche eliminare un po 'di cronologia, fare echo $HISTFILEper ottenere la posizione del file di cronologia (di solito ~/.bash_history) unset HISTFILEe modificarla ~/.bash_history(o qualunque cosa HISTFILEfosse - ovviamente è ora unsetche puoi' lo leggo).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Quindi hai modificato la tua cronologia e il fatto che l'hai modificata!


Ho provato questo: GNU bash, versione 3.2.57 (1) -release (x86_64-apple-darwin15) e non funziona. I comandi che ho usato dopo aver annullato la STORIA sono stati memorizzati in ~ / .bash_history
Krystian

@Krystian Il mio errore - avevo scritto "unset HISTORY" quando doveva essere "unset HISTFILE" - corretto. Funziona adesso? Funziona su GNU bash, versione 4.3.30 (1) -release (x86_64-pc-linux-gnu).
drkvogel,

bene non ne sono sicuro. Test semplice: unset HISTFILE; echo TEST; historyti darà il comando echo TESTcome il precedente all'ultimo. Anche se dopo aver terminato la sessione e riconnesso, la cronologia non ha effettivamente questa voce. Quindi direi che funziona :)
Krystian

unset HISTFILEnon sembra interrompere la registrazione dei comandi nella cronologia in memoria, ma impedisce loro di essere registrati in qualunque file $ HISTFILE. Quindi suppongo che tu abbia ancora la tua storia locale in memoria, ma non viene più registrata in un file, che è quello che potresti desiderare! ;)
drkvogel

4

Puoi anche usare il seguente comando:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Penso che sia un comando molto portatile.


Ho creato un alias da questo: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"e ora puoi farlo in questo modo:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
Ci dispiace, ma mi rendo conto che devi creare una funzione anziché un alias a causa delle virgolette che cambiano significato di $se altre cose in sed. function forget() { // put code here // }
sobi3ch,

3

Se stai usando zsh puoi eseguire:

setopt histignorespace

Dopo aver impostato questo, ogni comando che inizia con uno spazio verrà escluso dalla cronologia.

È possibile utilizzare gli alias in .zshrcper trasformare questo on / off :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

Bene

2

Esistono diversi modi per raggiungere questo obiettivo. Questo imposta la dimensione del file della cronologia su 0:

export HISTFILESIZE=0

Questo imposta il file della cronologia su /dev/null, disabilitandolo efficacemente:

export HISTFILE=/dev/null

Per i singoli comandi, puoi aggiungere il prefisso al comando con uno spazio e non verrà salvato nel file della cronologia. Nota che questo richiede di avere il ignorespacevalore incluso nella $HISTCONTROLvariabile d'ambiente (man bash e cerca ignorespacemaggiori dettagli).


2
Ciò impedirà la registrazione di tutti i comandi. Non è quello che vuole l'interrogante.
Noufal Ibrahim,

Beh, ho supposto che l'interrogatore avrebbe ripristinato i valori dopo aver fatto tutto ciò che voleva che non fosse registrato.
pgl

1

Questo è utile se vuoi cancellare tutta la cronologia, incluso il fatto che hai cancellato tutta la cronologia!

rm .bash_history;export HISTFILE=/dev/null;exit

0

Devi solo eseguire:
$ set +o history

Per vedere di più, esegui:
$ man set


2
Ciò disabilita la cronologia per tutti i comandi futuri, non per un singolo comando. La maggior parte delle persone che vengono qui dovrebbe invece cercare la risposta accettata.
Tripleee

Questo è valido o ok ma incompleto. Finché aggiungiamo successivamente il comando inverso set -x history, funziona.
Abdillah,

0

Questo comando potrebbe tornare utile. Questo non registra il comando che viene eseguito

history -d $((HISTCMD-1)) && <Your Command Here>
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.