Log de comandos executados no Bash

1

Algum tempo atrás, nós tínhamos um requisito para registrar comandos executados no terminal no shell Bash. Isso foi resolvido por meio de um script de inicialização com essencialmente os seguintes conteúdos:

#!/bin/bash

SESSION_LAST_COMMAND=

log_last_command() {
    local command

    command=$(history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")

    if [[ -n "$SESSION_LAST_COMMAND" ]]; then
        logger -p local3.notice "shell user [$$]: Executed command: $command"
    fi

    SESSION_LAST_COMMAND="$command"
}

export PROMPT_COMMAND=log_last_command

Funciona bem, exceto que pressionar ENTER registra o último comando novamente. Isso acontece quantas vezes a tecla enter é pressionada. E alguns usuários têm esse hábito! Existe uma maneira de evitar esses logs extras? Além disso, uma expectativa óbvia da solução é que uma distinção entre apenas pressionar algumas vezes e executar novamente o comando seja possível.

    
por pdp 20.12.2013 / 18:02

2 respostas

2

Consegui resolver o problema do registro repetido de comandos acionado pela tecla ENTER substituindo a invocação do "histórico 1" por "histórico -a > (tee -a $ HISTFILE)". Posteriormente, após o último comando ter sido encontrado e registrado, "history -c; history -r" é executado para remover todas as entradas da lista de comandos na memória do Bash e gerar novamente a lista de qualquer coisa que tenha sido salva no arquivo de histórico. Isso é necessário para obter apenas um único comando na próxima vez que a "história -a" for executada. Aqui está a solução:

session_log_command() {
    local status=$?
    local command
    local cwd

    cwd=$PWD

    command=$(history -a >(tee -a $HISTFILE))

    if [[ -n "$command" ]]; then
        logger -p local3.notice "shell user [$$]: Executing command [CWD=$cwd ; $status]: $command"
        history -c; history -r
    fi
}

export PROMPT_COMMAND=session_log_command
    
por pdp 05.03.2014 / 16:23
0

Se você procurar no diretório inicial de cada usuário, ele deverá ser um arquivo chamado .bash_history . Este é um arquivo oculto, então no Nautilus você precisa pressionar Ctrl + H para visualizá-lo, ou com ls você precisa usar a opção -a . Isto irá conter os últimos 1000 comandos que o usuário inseriu. Então, pensei que você poderia registrar esse arquivo regularmente, em vez de usar o comando history ...

    
por Wilf 20.12.2013 / 18:28