Questão Log de comandos executados no Bash


Algum tempo atrás, nós tivemos um requisito para registrar comandos executados no terminal no shell Bash. Isso foi resolvido por meio de um script de inicialização com basicamente 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

Ele 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 entrar algumas vezes e realmente executar novamente o comando seja possível.


1
2017-12-20 17:02


origem


Você quer dizer como a história faz? o que você precisa fazer não é processar linhas de leitura em branco. Eu vou olhar isso depois. - j0h
Esse script pode parecer funcionar bem, mas é provável que não. Se o usuário colocar um espaço na linha antes do comando, esse comando não será registrado no histórico e, por isso, não será registrado em seu script também. - falconer


Respostas:


Consegui resolver o problema do log de comando repetido 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

2
2018-03-05 15:23





Se você procurar no diretório inicial de cada usuário, ele deve 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 o -a opção. Isto irá conter os últimos 1000 comandos que o usuário inseriu. Então eu pensei que você poderia apenas registrar esse arquivo regularmente, em vez de usar o history comando...


0
2017-12-20 17:28



O método de registro de comandos via "logger" obtém a mensagem finalmente em / var / log / messages, que é menos suscetível a ser deletado do que um arquivo no diretório home de um usuário. Além disso, esse método ajuda a registrar comandos para todos os usuários e não apenas para os meus. - pdp