不久前,我们有一个需求,需要记录在 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
...