Bash: journaliser l'historique de commandes dans syslog
Activation de la fonction de log avec bash 4.1+
A partir de la version 4.1, on peut demander la journalisation dans syslog de l'hisstorique bash à la compilation. Il suffit de compiler avec l'option SYSLOG_HISTORY positionnée dans config-top.h. Voir Rpmbuild avec modifications (ajout de patch). S'assurer que la configuration de rsyslog est cohérence avec le 'facility' utilisé pour journaliser dans config-top.h.
- Avantage: plus fiable que le trap DEBUG ci-dessous (mais implique de désactiver tout autre shell pour être complète)
- Inconvénients: implique de refaire le patch+compilation à chaque mise à jour du package bash.
Méthode via trap DEBUG
Le trap DEBUG de bash associé à la variable BASH_COMMAND permet de journaliser toute commande exécutée dans syslog.
- ajouter le fichier logcmd.sh dans /etc/profile.d, (permissions 644 = rwxr--r--), et le contenu
1 function cmd2syslog
2 {
3 unset PROMPT_COMMAND
4 if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then
5 __cmd2syslog "$BASH_COMMAND"
6 fi
7 }
8 function __cmd2syslog
9 {
10 cmdline=$1
11 remssh=""
12 if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
13 remssh=" (non-interactive SSH from $SSH_CLIENT)"
14 fi
15 logger -d -p local6.debug -t bash "${USER}[$$]${remssh}: $cmdline"
16 }
17 if [ -n "$PS1" ]; then
18 trap cmd2syslog DEBUG
19 fi
- ce script sera lu par /etc/bashrc et pris en compte automatiquement au lancement d'un shell bash interactif (test sur PS1).
- la fonction __cmd2syslog est destinée à être appelée dans le cas de commande non interactive via ssh, en ajoutant dans /etc/bashrc:
1 if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
2 . /etc/profile.d/logcmd.sh
3 __cmd2syslog "$BASH_EXECUTION_STRING"
4 fi
- ici, on utilise local6.debug pour logger, il faut ajouter une règle dans rsyslog.conf (ou équivalent) pour journaliser dans un fichier, par exemple dans log secure:
local6.* /var/log/secure
- Avantage: facile à mettre en oeuvre sans recompiler bash.
- Inconvénients:
- méthode très facile à contourner (il suffit de détourner ou annuler le trap DEBUG).
- peut générer un peu de déchet avec set -x sur un shell interactif.
- spécifique à bash.