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?
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 .
ignoredups
est 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 sed
name__:
# 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 d
pour 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
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*'
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.
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é.
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.