我正在尝试记录所有用户运行的所有命令。我得到了一个解决方案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