Регистрация команд, выполненных в Bash

Некоторое время назад у нас было требование регистрировать команды, запущенные на терминале в оболочке Bash. Это было решено с помощью сценария запуска со следующим содержанием:

#!/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

Он отлично работает, за исключением того, что нажатие ENTER снова регистрирует последнюю команду. Это происходит столько раз, сколько нажата клавиша ввода. И некоторые пользователи имеют эту привычку! Есть ли способ избежать этих лишних логов? Кроме того, очевидное ожидание решения будет состоять в том, что различие между простым нажатием клавиши ввода несколько раз и фактическим повторным запуском команды будет возможным.

1
задан 20 December 2013 в 21:02

2 ответа

Мне удалось решить проблему повторного ведения журнала команд, запускаемого клавишей ENTER, заменив вызов «history 1» на «history -a> (tee -a $ HISTFILE)». Впоследствии, после того, как последняя команда была найдена и зарегистрирована, запускается «history -c; history -r», чтобы удалить все записи из списка команд Bash в памяти и восстановить список из того, что было сохранено в файле истории. Это необходимо для получения только одной команды при следующем запуске «history -a». Вот решение:

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
0
ответ дан 20 December 2013 в 21:02

Если вы посмотрите в домашний каталог каждого пользователя, это должен быть файл с именем .bash_history. Это скрытый файл, поэтому в Nautilus вам нужно нажать Ctrl + H , чтобы просмотреть его, или с ls вам нужно использовать опцию -a. Он будет содержать последние 1000 команд, введенных пользователем. Поэтому я подумал, что вы можете просто регулярно регистрировать этот файл вместо использования команды history ...

0
ответ дан 20 December 2013 в 21:02

Другие вопросы по тегам:

Похожие вопросы: