web-dev-qa-db-fra.com

Masquer "historique -d" dans l'histoire de bash

Si je tape accidentellement mon mot de passe ou tout autre élément sensible dans bash, je peux facilement supprimer cette ligne avec history -d ROW#, mais il me reste toujours la commande history -d ROW# dans l'historique, indiquant à tout le monde que quelqu'un a corrigé une erreur.

Puis-je ajouter quelque chose à une commande pour l'empêcher d'apparaître dans l'historique bash?

14
Kalle Ling

Pour ne pas enregistrer une seule commande dans votre historique, faites-la simplement précéder d'un espace (marqué avec ici):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

Ce comportement est défini dans votre fichier ~/.bashrc, à savoir dans cette ligne:

HISTCONTROL=ignoreboth

man bash dit:

HISTCONTROL
Une liste de valeurs séparées par deux points contrôlant la manière dont les commandes sont enregistrées dans la liste de l'historique. Si la liste de valeurs comprend ignorespace , , les lignes commençant par un caractère d'espacement ne sont pas enregistrées dans l'historique . Une valeur de ignoredups empêche les lignes correspondant à l'entrée d'historique précédente d'être enregistrées. Une valeur de ignoreboth est un raccourci pour ignore l'espace et ignoredups .

ignoredupsest d'ailleurs la raison pour laquelle history | tail -n2 apparaît une seule fois dans l'historique du test ci-dessus.


L'historique d'un terminal est enregistré dans la RAM et transféré dans votre ~/.bash_history dès que vous fermez le terminal. Si vous souhaitez supprimer une entrée spécifique de votre ~/.bash_history, vous pouvez le faire avec sedname__:

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

Dans le dernier, j’ai modifié le délimiteur par défaut / en _, tel qu’il est utilisé dans le terme de recherche; en réalité, il correspond à sed -i '/\/path\//d' .bash_history. Si la commande génère uniquement les lignes que vous souhaitez supprimer, ajoutez l'option -i et remplacez !d par dpour effectuer la suppression:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere
28
dessert

Une solution serait de définir la variable d’environnement HISTIGNORE. De man bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW, il s'agit de la valeur par défaut HISTCONTROL qui fournit la solution de contournement type-a-espace-devant-]].

Donc, par exemple

HISTIGNORE='history -d*'

Si vous voulez qu'il soit persistant, exportez-le à partir de votre ~/.bashrc

export HISTIGNORE='history -d*'
12
steeldriver

Vous pouvez

  • Fermez la ou les fenêtres du terminal . Cela videra l'historique le plus récent dans la fenêtre du terminal que vous fermez la plus récente (après la fermeture des autres fenêtres) dans le fichier /home/$USER/.bash_history

  • Editez le fichier /home/$USER/.bash_history sans faire appel à bash, par exemple en lançant votre éditeur favori via Alt+F2

    De cette façon, vous pouvez inspecter l’ensemble de l’historique et supprimer toutes les commandes que vous ne voulez plus voir apparaître.

    enter image description here

    enter image description here

6
sudodus

J'utilise habituellement:

history -w; history -c; $EDITOR $HISTFILE; history -r

Le fichier historique est écrit sur le disque, effacé en mémoire, vous le modifiez pour faire ce que vous voulez, puis le fichier historique que vous avez modifié est lu.

Notez que si votre éditeur enregistre les fichiers de sauvegarde, le vilain Word peut toujours apparaître sur le disque.

Une autre option utilisant -d consiste à utiliser des nombres d'historique prédictifs:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

Dans cet exemple, je supprime la mauvaise chose, je supprime la commande pour obtenir le numéro d'historique, puis je supprime la commande que j'ai utilisée pour supprimer l'historique. Tout est alors désinfecté.

1
Seth Robertson

Si vous souhaitez exécuter une commande sans l'enregistrer dans l'historique, ajoutez-y un espace supplémentaire.

Prompt$ echo saved
Prompt$  echo not saved \
> #     ^ extra space

Pour que cela fonctionne, vous devez soit ignorer l'espace, soit ignorer les deux dans HISTCONTROL. Par exemple, exécutez

HISTCONTROL = ignorespace Pour rendre ce paramètre persistant, mettez-le dans votre fichier .bashrc.

0
bkdroid13