Bash: journaliser l'historique de commandes dans syslog : Différence entre versions
m (→Activation de la fonction de log avec bash 4.1+) |
m (→Méthode via trap DEBUG) |
||
| Ligne 15 : | Ligne 15 : | ||
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 21 : | ||
{ | { | ||
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 | ||
| Ligne 44 : | Ligne 31 : | ||
fi | fi | ||
* 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: | ||
| + | if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then | ||
| + | . /etc/profile.d/logcmd.sh | ||
| + | __cmd2syslog "$BASH_EXECUTION_STRING" | ||
| + | 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: | * 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 | ||
Version du 1 février 2018 à 07:52
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
function cmd2syslog
{
unset PROMPT_COMMAND
if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then
__cmd2syslog "$BASH_COMMAND"
fi
}
function __cmd2syslog
{
cmdline=$1
remssh=""
if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
remssh=" (non-interactive SSH from $SSH_CLIENT)"
fi
logger -d -p local6.debug -t bash "${USER}[$$]${remssh}: $cmdline"
}
if [ -n "$PS1" ]; then
trap cmd2syslog DEBUG
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:
if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then . /etc/profile.d/logcmd.sh __cmd2syslog "$BASH_EXECUTION_STRING" 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.