Вопрос Ведение журнала команд, выполненных в 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
2017-12-20 17:02


происхождения


Вы имеете в виду, как $ history? то, что вам нужно сделать, это не очистка строк процесса. Я расскажу об этом позже. - j0h
Этот скрипт может выглядеть нормально, но, скорее всего, нет. Если пользователь помещает пробел в строку перед командой, тогда эта команда не будет регистрироваться в истории, и из-за этого она также не войдет в ваш скрипт. - falconer


ответы:


Мне удалось решить проблему повторного ведения журнала, инициированного клавишей 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

2
2018-03-05 15:23





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


0
2017-12-20 17:28



Метод протоколирования команд через «logger» получает сообщение, наконец, в / var / log / messages, что менее восприимчиво к удалению, чем файл в домашнем каталоге пользователя. Кроме того, этот метод помогает выполнять команды журналов для всех пользователей, а не только моих. - pdp