Некоторое время назад у нас было требование регистрировать команды, запущенные на терминале в оболочке 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 снова регистрирует последнюю команду. Это происходит столько раз, сколько нажата клавиша ввода. И некоторые пользователи имеют эту привычку! Есть ли способ избежать этих лишних логов? Кроме того, очевидное ожидание решения будет состоять в том, что различие между простым нажатием клавиши ввода несколько раз и фактическим повторным запуском команды будет возможным.
Мне удалось решить проблему повторного ведения журнала команд, запускаемого клавишей 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
Если вы посмотрите в домашний каталог каждого пользователя, это должен быть файл с именем .bash_history
. Это скрытый файл, поэтому в Nautilus вам нужно нажать Ctrl kbd> + H kbd>, чтобы просмотреть его, или с ls
вам нужно использовать опцию -a
. Он будет содержать последние 1000 команд, введенных пользователем. Поэтому я подумал, что вы можете просто регулярно регистрировать этот файл вместо использования команды history
...