记录在 Bash 中执行的命令

记录在 Bash 中执行的命令

不久前,我们有一个需求,需要记录在 Bash shell 终端上运行的命令。这个问题通过一个启动脚本解决了,该脚本的内容如下:

#!/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 键的次数相同。有些用户确实有这个习惯!有没有办法避免这些额外的日志?此外,解决方案的一个明显期望是能够区分只按几次 Enter 键和实际重新运行命令。

答案1

我设法解决了 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

如果您查看每个用户的主目录,它们应该是一个名为的文件.bash_history。这是一个隐藏文件,因此在 Nautilus 中您需要按Ctrl+H来查看它,或者ls您需要使用选项-a。这将包含用户输入的最后 1000 条命令。所以我认为您可以定期记录该文件,而不是使用命令history...

相关内容