Tutoriel Linux

Historique Bash sous Linux : retrouver une commande sans y laisser un secret

Débutant5 min de lecture

Vous venez de lancer une longue commande Bash et vous ne voulez pas la retaper. La commande history permet de la retrouver rapidement. Le problème, c’est que Bash peut aussi conserver un mot de passe, un jeton d’API ou une URL signée collés directement dans le terminal.

Voici comment lire l’historique Bash, supprimer une ligne sensible et éviter qu’un secret termine dans ~/.bash_history. Si un vrai secret a déjà été saisi, le retirer de l’historique ne suffit pas : révoquez-le ou changez-le.

Tux retire une fiche secrète de l’historique Bash et la détruit devant une archive de commandes
L’historique Bash retrouve une commande en quelques secondes, mais un mot de passe ou un jeton saisi dans le terminal doit être retiré puis révoqué.

Retrouver une commande avec history et Ctrl+R

Pour afficher les dernières commandes de la session Bash, commencez par limiter la sortie :

history 30

Chaque ligne reçoit un numéro. Vous pouvez ensuite filtrer la liste avec un morceau non sensible de la commande, par exemple le nom du service ou de l’outil :

history | grep -i -- 'systemctl'
history | grep -i -- 'docker login'

Ne mettez jamais le mot de passe ou le jeton lui-même dans le motif de recherche : cette nouvelle commande serait elle aussi ajoutée à l’historique. Si vous devez aller plus loin sur les filtres, le guide consacré à grep sous Linux détaille les recherches insensibles à la casse et les expressions régulières.

Dans un terminal interactif, Ctrl+R lance une recherche inversée. Tapez quelques caractères, appuyez de nouveau sur Ctrl+R pour remonter vers une occurrence plus ancienne, puis utilisez la flèche droite pour modifier la ligne sans l’exécuter immédiatement.

Pour afficher la date et l’heure associées aux entrées quand Bash dispose de ces informations :

HISTTIMEFORMAT='%F %T ' history 30

Vérifier où Bash enregistre l’historique

La liste visible avec history appartient à la session actuelle. Le fichier persistant est indiqué par la variable HISTFILE. Par défaut, Bash utilise généralement ~/.bash_history.

printf 'HISTFILE=%s\n' "${HISTFILE:-non défini}"
printf 'HISTSIZE=%s\n' "${HISTSIZE:-non défini}"
printf 'HISTFILESIZE=%s\n' "${HISTFILESIZE:-non défini}"
if [ -n "${HISTFILE:-}" ]; then
  stat -- "$HISTFILE"
fi

HISTSIZE limite le nombre d’entrées gardées en mémoire. HISTFILESIZE limite celles écrites dans le fichier. Si HISTFILE n’est pas défini, la session peut fonctionner sans fichier persistant.

L’historique dépend aussi de l’utilisateur et du shell. Votre compte, root et un autre utilisateur n’écrivent pas dans le même fichier. Zsh et Fish ont leur propre mécanisme. Vérifiez le shell réellement utilisé avant de nettoyer le mauvais emplacement :

printf 'Shell de connexion : %s\n' "$SHELL"
printf 'Processus courant : %s\n' "$0"

Supprimer une ligne sensible sans effacer tout le fichier

Repérez la ligne avec un motif qui ne contient pas le secret. Supposons que history affiche le numéro 1842 pour la commande concernée :

history -d 1842
history -w

history -d retire l’entrée de la liste en mémoire. history -w réécrit ensuite le fichier avec la liste courante. Contrôlez le résultat avec le nom de la commande, jamais avec la valeur secrète :

history | grep -i -- 'nom-de-la-commande'
if [ -n "${HISTFILE:-}" ]; then
  grep -n -i -- 'nom-de-la-commande' "$HISTFILE"
fi

Évitez de modifier ~/.bash_history avec un éditeur pendant que plusieurs sessions Bash sont ouvertes. Une autre session peut réécrire ou rajouter ses propres lignes à sa fermeture. Fermez d’abord les shells inutiles, ou répétez le nettoyage dans chaque session concernée, puis faites la vérification finale sur le fichier.

La commande history -c efface toute la liste en mémoire. Elle est trop brutale pour retirer une seule ligne et peut vous faire perdre un historique utile. Mieux vaut cibler l’entrée, écrire le fichier, puis le relire.

Pourquoi il faut révoquer le secret malgré le nettoyage

Supprimer une ligne Bash n’est pas un effacement sécurisé. Le secret a pu être copié dans une sauvegarde, collecté par un outil d’audit, synchronisé vers un serveur central ou vu temporairement dans la liste des processus s’il a été passé comme argument.

  • Changez le mot de passe concerné.
  • Révoquez le jeton d’API et créez-en un nouveau.
  • Contrôlez les journaux d’accès du service.
  • Vérifiez les autres sessions, comptes et machines où la commande a pu être utilisée.

Une passphrase SSH ne devrait pas être collée dans une commande. Utilisez plutôt un agent : le guide ssh-agent sous Linux montre comment éviter de la retaper tout en gardant la clé privée protégée.

Empêcher Bash d’enregistrer une commande sensible

Bash peut ignorer les commandes précédées d’un espace si HISTCONTROL contient ignorespace. Vérifiez d’abord la valeur active :

printf '%s\n' "$HISTCONTROL"

Pour ignorer les commandes précédées d’un espace et les doublons consécutifs dans la session courante :

HISTCONTROL=ignorespace:ignoredups

Une commande commençant réellement par un espace ne sera alors pas enregistrée. Ce réglage est pratique, mais ce n’est pas une barrière de sécurité : il peut être absent sur une autre machine, désactivé ou contourné par un autre shell.

Pour une opération ponctuelle, désactivez l’historique, lancez la commande à protéger, puis réactivez-le :

set +o history

Lancez maintenant la commande sans écrire le secret directement dans la ligne. Réactivez ensuite l’historique :

set -o history

Le mieux reste d’utiliser l’entrée standard, un gestionnaire de secrets, un fichier de configuration en mode 600 ou le mécanisme d’identification prévu par l’outil. Si vous rendez HISTCONTROL permanent dans ~/.bashrc, sauvegardez le fichier et rechargez-le seulement après vérification. Le guide sur PATH et la configuration du shell reprend cette méthode de modification prudente.

La page de manuel de Bash décrit précisément history -d, history -w, HISTFILE, HISTCONTROL et HISTTIMEFORMAT. Après le nettoyage, ouvrez une nouvelle session et vérifiez une dernière fois le fichier : c’est elle qui vous dira si le secret a vraiment disparu de l’historique persistant.