Bash: journaliser l'historique de commandes dans syslog : Différence entre versions
m (→Activation de la fonction de log avec bash 4.1+) |
m (ajout coloration de syntaxe) |
||
| (2 révisions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 11 : | Ligne 11 : | ||
Le trap DEBUG de bash associé à la variable BASH_COMMAND permet de journaliser toute commande exécutée dans syslog. | 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 | * ajouter le fichier logcmd.sh dans /etc/profile.d, (permissions 644 = rwxr--r--), et le contenu | ||
| + | <syntaxhighlight lang="bash" line='line'> | ||
function cmd2syslog | function cmd2syslog | ||
{ | { | ||
unset PROMPT_COMMAND | unset PROMPT_COMMAND | ||
if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then | if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then | ||
| − | + | __cmd2syslog "$BASH_COMMAND" | |
fi | fi | ||
} | } | ||
| Ligne 21 : | Ligne 22 : | ||
{ | { | ||
cmdline=$1 | cmdline=$1 | ||
| − | + | remssh="" | |
| − | + | if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then | |
| − | if | + | remssh=" (non-interactive SSH from $SSH_CLIENT)" |
| − | |||
| − | |||
| − | |||
| − | |||
fi | fi | ||
| − | + | logger -d -p local6.debug -t bash "${USER}[$$]${remssh}: $cmdline" | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
if [ -n "$PS1" ]; then | if [ -n "$PS1" ]; then | ||
trap cmd2syslog DEBUG | trap cmd2syslog DEBUG | ||
fi | fi | ||
| + | </syntaxhighlight> | ||
* ce script sera lu par /etc/bashrc et pris en compte automatiquement au lancement d'un shell bash interactif (test sur PS1). | * 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: | ||
| + | <syntaxhighlight lang="bash" line='line'> | ||
| + | if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then | ||
| + | . /etc/profile.d/logcmd.sh | ||
| + | __cmd2syslog "$BASH_EXECUTION_STRING" | ||
| + | fi | ||
| + | </syntaxhighlight> | ||
| + | |||
* 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: | * 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 | local6.* /var/log/secure | ||
| Ligne 53 : | Ligne 50 : | ||
** peut générer un peu de déchet avec set -x sur un shell interactif. | ** peut générer un peu de déchet avec set -x sur un shell interactif. | ||
** spécifique à bash. | ** spécifique à bash. | ||
| + | |||
| + | [[Category:Bash]] | ||
| + | [[Category:Syslog]] | ||
Version actuelle datée du 28 juillet 2018 à 15:57
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.