记录在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键再次记录最后一个命令。 这种情况会在按下回车键的情况下发生多次。 有些用户确实有这个习惯! 有没有办法避免这些额外的日志? 此外,解决方案的一个明显期望是,只需按几次输入并实际重新运行命令就可以区分。

我设法通过用“history -a>(tee -a $ HISTFILE)”替换“历史1”调用来解决由ENTER键触发的重复命令记录的问题。 随后,在找到并记录最后一个命令后,运行“history -c; history -r”以从Bash的内存中命令列表中删除所有条目,并从历史文件中保存的任何内容重新生成列表。 这是在下次执行“历史-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 + H来查看它,或者使用ls你需要使用-a选项。 这将包含用户输入的最后1000个命令。 所以我认为你可以定期记录该文件,而不是使用history命令…