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.