Masquer «history -d» dans l'historique bash

14

Si je tape accidentellement mon mot de passe ou tout autre élément sensible dans bash, je peux facilement supprimer cette ligne history -d ROW#, mais je reste toujours avec la history -d ROW#commande dans l'historique montrant à 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?

Kalle Ling
la source

Réponses:

27

Pour ne pas enregistrer une seule commande dans votre historique, il suffit de la précéder d'un espace (marqué 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 ~/.bashrcfichier, à savoir dans cette ligne:

HISTCONTROL=ignoreboth

man bash dit:

HISTCONTROL
Une liste de valeurs séparées par deux-points contrôlant la façon dont les commandes sont enregistrées dans la liste d'historique. Si la liste de valeurs inclut ignorer l'espace , les lignes qui commencent par un caractère espace ne sont pas enregistrées dans la liste d'historique . Une valeur ignorée entraîne la non- sauvegarde des lignes correspondant à l'entrée d'historique précédente. Une valeur de ignoreboth est un raccourci pour ignorespace et ignoredups .

ignoredupssoit dit en passant est la raison pour laquelle history | tail -n2apparaît une seule fois dans l'histoire dans le test ci-dessus.


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

                                   # 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 changé le délimiteur par défaut /pour _qu'il est utilisé à l' intérieur du terme de recherche, en fait , c'est égal à sed -i '/\/path\//d' .bash_history. Si la commande ne produit que les lignes que vous souhaitez supprimer, ajoutez l' -ioption et passez !dà 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
dessert
la source
12

Une façon serait de définir la HISTIGNOREvariable d'environnement. Deman 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, c'est la valeur par défaut HISTCONTROLqui fournit la solution de contournement type-a-space-in-front].

Ainsi, par exemple

HISTIGNORE='history -d*'

Si vous souhaitez qu'il persiste, exportez-le depuis votre ~/.bashrc

export HISTIGNORE='history -d*'
tournevis
la source
6

Vous pouvez

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

  • Modifiez le fichier/home/$USER/.bash_history sans impliquer bash, par exemple en démarrant votre éditeur préféré via Alt+F2

    De cette façon, vous pouvez inspecter tout l'historique et supprimer toutes les commandes que vous ne souhaitez plus voir.

    entrez la description de l'image ici

    entrez la description de l'image ici

sudodus
la source
1

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 relu.

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

Une autre option à utiliser -dconsiste à utiliser des numéros 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 aseptisé.

Seth Robertson
la source
0

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

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

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

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

bkdroid13
la source