bash 历史记录所有命令到 syslog

bash 历史记录所有命令到 syslog

我正在尝试记录所有用户运行的所有命令。我得到了一个解决方案Github

 function log2syslog
 {
     declare COMMAND
     COMMAND=$(fc -ln -0)
     logger -p local1.notice -t bash -i -- "${USER}:${COMMAND}"
 }
 trap log2syslog DEBUG

 PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -t "$USER[$$] $SSH_CONNECTION")'

但如果我们多次按下回车键,日志会显示我们实际上也多次执行了该命令。我该如何避免这种情况?

答案1

fc如果您只需要当前命令行,则无需使用,因为 shell 变量BASH_COMMAND正好包含该内容。我只需捕获信号DEBUG并使用此变量像之前一样,例如:

trap 'echo "$USER":"$BASH_COMMAND" >>/path/to/log' DEBUG

Enter这样做还有一个好处,如果你只是按下– ,它不会向日志中写入任何内容,fc只会从历史列表中读取最后一个条目。不幸的是,我无法logger在我的系统上测试你的命令,但你听起来它运行良好,所以这个应该也可以:

trap 'logger -p local1.notice -t bash -i -- "$USER":"$BASH_COMMAND"' DEBUG

示例运行

请注意,alias诸如ls、空行(Enter)和输入错误的命令是如何记录的。

$ trap 'echo "$USER":"$BASH_COMMAND" >>/path/to/log' DEBUG
$ uname
Linux
$ pwd
/home/dessert
$ hostname
dessert’s plowhorse
$ ls
dir1 file1 file2
$ 
$ 
$ bahs
No command 'bahs' found, did you mean:
 Command 'bash' from package 'bash' (main)
 Command 'bats' from package 'bats' (universe)
bahs: command not found
$ cat /path/to/log
dessert:uname
dessert:pwd
dessert:hostname
dessert:ls --color=auto
dessert:bahs
dessert:cat /path/to/log

相关内容