Dove è memorizzata la storia di Bash?


95

Se corro history, posso vedere i miei ultimi comandi eseguiti.

Ma se lo faccio tail -f $HISTFILEo tail -f ~/.bash_history, non vengono elencati.

Il file viene bloccato, esiste un percorso temporaneo o qualcosa di simile?

Risposte:


117

Bash mantiene l'elenco dei comandi internamente in memoria mentre è in esecuzione. Sono scritti .bash_historyall'uscita :

Quando esce una shell interattiva, le ultime righe di $ HISTSIZE vengono copiate dall'elenco della cronologia nel file denominato da $ HISTFILE

Se si desidera forzare la cronologia dei comandi da scrivere, è possibile utilizzare il history -acomando, che:

Aggiungi le nuove righe della cronologia (righe della cronologia inserite dall'inizio della sessione Bash corrente) al file della cronologia.

C'è anche -wun'opzione:

Scrivi la cronologia corrente nel file della cronologia.

che può adattarti maggiormente a seconda di come usi la tua cronologia.

Se vuoi assicurarti che siano sempre scritti immediatamente, puoi inserire quel comando nella tua PROMPT_COMMANDvariabile:

export PROMPT_COMMAND='history -a'

Nota a margine: se il tuo .bash_historyfile diventa accidentalmente di proprietà di root, le cose smettono di funzionare. In tal caso, controllare la proprietà e utilizzare sudoper correggere la proprietà, se necessario.
Torek

13

(Non è una risposta ma non posso aggiungere commenti)

Se si sta verificando .bash_historyperché si desidera solo eliminare un comando specifico (ad esempio contenente una password in chiaro), è possibile eliminare direttamente la voce in memoria di history -d <entry_id>.

Ad esempio, supponendo un output come:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

e vuoi eliminare la exportlinea, puoi semplicemente raggiungerla:

history -d 928

11

bash lo mantiene nella memoria di lavoro, bash può essere configurato per salvarlo quando bash si chiude o dopo ogni comando e per essere caricato all'avvio di bash o su richiesta.

Se si configura il salvataggio dopo ogni comando, considerare le implicazioni di avere più bash in esecuzione contemporaneamente. (le righe di comando saranno interfogliate)


2
L'inizio della tua risposta fa sembrare che la cronologia sia memorizzata in un file chiamato bash, o anche bashnell'esetable. Scriverei "È archiviato bashin memoria, ..."
Anthon,

è davvero meglio
Anthon,

5

I comandi vengono salvati in memoria (RAM) mentre la sessione è attiva. Non appena si chiude la shell, l'elenco dei comandi viene scritto .bash_historyprima dell'arresto.

Pertanto, non vedrai la cronologia della sessione corrente in .bash_history.


4
Il file della cronologia viene aggiornato al bashtermine, il che non implica il riavvio (specialmente negli ambienti grafici in cui è possibile aprire e chiudere i terminali come desiderato).
John WH Smith,

4

Durante l'esecuzione, la cronologia viene mantenuta in memoria (per impostazione predefinita) se:

  • set -o history (an Hin echo "$-") è impostato.
  • HISTSIZE non è 0 e
  • HISTIGNORE non lo è *(o qualche altro modello molto restrittivo).

Se una delle precedenti operazioni non riesce, nessuna cronologia viene archiviata in memoria e di conseguenza nessuna cronologia può o verrà scritta sul disco.

La cronologia in memoria viene scritta sul disco se:

  • HISTFILESIZE non è 0 e
  • HISTFILE non è disinserito.

Ma solo quando la shell esce o se vengono eseguiti i comandi history -a(append) o history -w(write).

Per attivare una scrittura immediata su disco è possibile utilizzare la variabile:

 PROMPT_COMMAND='history -a'

quale sarà appendla newriga della cronologia al file della cronologia. Queste sono le righe della cronologia inserite dall'inizio della sessione bash corrente, ma non già aggiunte al file della cronologia.

O:

 PROMPT_COMMAND='history -w'

Per sovrascrivere la cronologia nel HISTFILE con l'elenco dalla memoria.

Quindi, puoi rimuovere un comando dalla cronologia in memoria:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

E scrivilo su disco con l'ultimo comando:

 history -w    # with `shopt -u histappend` unset

Ci sarebbe qualcosa di sbagliato inserendolo in un cron job? Ho il sospetto che molti utenti con molti meno nomi utente accedano a un determinato server e che la cronologia sia piuttosto piccola e questo sia un vecchio server, ma forse alcune sessioni non verranno mai chiuse ...
oneindelijk
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.