Étiquette : HISTTIMEFORMAT

9 mai 2018 /
1. Ignorer certaines commandes dans l’historique
echo 'HISTIGNORE="&:[ ]*:[ls]:*:exit:pwd:clear:history"' >> ~/.bashrc

Amélioration :

  • Utilise ~/.bashrc au lieu de ~/.profile (plus adapté pour les variables Bash interactives).
  • Ajoute [ ]* pour ignorer aussi les commandes commençant par des espaces (redondant avec ignorespace, mais explicite).
  • Guillemets simples pour éviter les problèmes d’échappement.
  • Le signe « & » permet d’éviter d’enregistrer deux commandes successives identiques.
Résultat : ne sauvegarde jamais ls, ps aux, exit, pwd, clear, history, ni les doublons consécutifs (&).
2. Ignorer les commandes commençant par espace + supprimer tous les doublons
echo 'HISTCONTROL=ignorespace:ignoredups:erasedups' >> ~/.bashrc

Explication et amélioration :

  • ignorespace : commande précédée d’un espace ne sera pas enregistrée.
  • ignoredups : ignore les doublons consécutifs.
  • erasedups : supprime tous les doublons dans l’historique (même non consécutifs) pour un historique ultra-propre.

Les trois combinés sont parfaits pour un historique clair et confidentiel.

3. Afficher la date et l’heure avec history:
echo 'HISTTIMEFORMAT="[%a %d %b %Y %T] "' >> ~/.bashrc
 1001  [mar 16 déc 2025 14:32:10] ls -la
 1002  [mar 16 déc 2025 14:35:22] sudo apt update
Très lisible : jour de la semaine, date, mois, année, heure complète.
4. Augmenter fortement la taille de l’historique:
echo 'HISTSIZE=100000' >> ~/.bashrc
echo 'HISTFILESIZE=100000' >> ~/.bashrc

Recommandation raisonnable :

  • 500 000 est énorme (fichier ~/.bash_history de plusieurs Mo).
  • 100 000 est déjà excellent pour un usage intensif (plusieurs années de commandes).
  • Si tu veux vraiment tout garder : 500000 reste acceptable sur un disque moderne.

Bonus très utile, forcer la synchronisation immédiate de l’historique (pour ne rien perdre en cas de crash ou plusieurs sessions) :

echo 'shopt -s histappend' >> ~/.bashrc
echo 'PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"' >> ~/.bashrc
  • histappend : ajoute à la fin du fichier au lieu d’écraser.
  • PROMPT_COMMAND : écrit immédiatement chaque commande dans le fichier et recharge l’historique partagé entre toutes les sessions.
Ajoute ce bloc unique pour tout faire d’un coup :
vi ~/.bashrc
# Historique Bash amélioré
HISTCONTROL=ignorespace:ignoredups:erasedups
HISTIGNORE="&:[ ]*:[ls]:*:exit:pwd:clear:history"
HISTTIMEFORMAT="[%a %d %b %Y %T] "
HISTSIZE=100000
HISTFILESIZE=100000
shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Appliquer immédiatement:

source ~/.bashrc
6 juin 2015 /

Pour avoir l’heure et la date en face de chaque commande de l’historique, il suffit de définir le paramètre HISTTIMEFORMAT dans ~/.bash_profile:

 echo 'HISTTIMEFORMAT="%Y/%m/%d @ %T "' >> ~/.bash_profile

Puis on recharge la configuration:

source ~/.bash_profile

%d = Jour
%m = Mois
%Y = Année sur 4 chiffres
%T = Heure complète

Sur un serveur où plusieurs administrateurs pourraient ce connecter, on peut rediriger la sortie de la commande history dans un fichier spécifique avec une rotation.

Ainsi il faut ajouter dans /etc/profile les lignes suivants:

# envoyer la commande dans syslog pour chaque commande AVANT exécution
trap 'logger -i -p local5.info -t bash "$USER $(tty): $(fc -ln -1)"' DEBUG

Ou

# envoyer la commande dans syslog pour chaque commande APRES exécution
PROMPT_COMMAND='logger -i -p local5.info -t bash "$USER $(tty): $(history 1)"'
# fc ne marche pas correctement dans PROMPT_COMMAND

Puis on met en place une redirection des logs dans un fichier à part, pour cela créer le fichier shell.conf:

vi /etc/rsyslog.d/shell.conf

Et on y met:

local5.* -/var/log/shell.log

Le tiret (-) devant le fichier de log permet une écriture asynchrone (pas forcément nécessaire, car ça ne risque pas d’impacter les perf, mais bon…)

Il ne reste plus qu’à créer un fichier de configuration pour logrotate:

vi /etc/logrotate.d/shell

Et on y met ça:

/var/log/shell.log {
rotate 30
daily
missingok
notifempty
delaycompress
compress
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
create 640 root adm
}

Une fois que tout est prêt, il n’y a plus qu’a relancer rsyslog :

/etc/init.d/rsyslog restart