Linux使用PROMPT_COMMAND环境变量记录用户操作日志

注:本文基于CentOS 6.5 编写

1、关于PROMPT_COMMAND环境变量

Bash在显示PS1之前先执行PROMPT_COMMAND定义的内容,而PS1也就是linux的命令提示符,关于PS1详细设置可参考:Linux 提示符后面显示全路径。

我们可以先感受一下PROMPT_COMMAND的功能效果,如果要显示命令执行的时间,可以如下操作。

[root@CentOS-6-5 /]# export PROMPT_COMMAND="echo -n [$(date +%k:%m:%S)]"
[23:12:10][root@CentOS-6-5 /]# pwd
/
[23:12:10][root@CentOS-6-5 /]#

利用这一特性,我们可以把用户执行的命令记录下来,甚至通过rsyslog记录到对应文件中。

2、记录历史命令

其实这个功能可以总结为shell+history方式,使用脚本和history命令实现。操作步骤如下:

A、添加PROMPT_COMMAND设置到/etc/bashrc

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
readonly PROMPT_COMMAND

因为日志使用rsyslog来输出,因此使用logger命令来输出日志,其中,-p命令指定syslog的日志等级,后面会讲到syslog的配置。日志的格式也在logger中指定,这里记录了命令执行的用户,进程号,具体命令,以及命令返回值。

将PROMPT_COMMAND设置为readonly的原因是因为,有些用户可以通过重设PROMPT_COMMAND的值来改变我们记录操作的行为,设置为只读后就无法修改。除非删除/etc/bashrc里的设置,并重新开一个工作窗口。

B、添加syslog配置

上面说到logger指定了日志级别,因此我们要在对应的rsyslog配置中添加这一等级,并执行日志存放位置。

在/etc/rsyslog.conf配置文件中添加以下配置,指定用户操作日志存放位置。

local6.*    /var/log/commands.log

添加后重启rsyslog服务,

service rsyslog restart

当然,为防止日志过大,还需要添加对应的logrotate配置。

3、记录效果

执行命令后观察日志记录效果如下:

Dec 18 00:10:04 CentOS-6-5 root: root [11304]: cd /home/ [0]
Dec 18 00:10:06 CentOS-6-5 root: root [11304]: pwd [0]
Dec 18 00:10:27 CentOS-6-5 root: root [11304]: df -h [0]
Dec 18 00:10:35 CentOS-6-5 root: root [11304]: nihao [127]

不过有个问题是,通过这种方式没办法记录ssh远程执行命令的情况。

当然也有可能我没有配置好,有知道的希望可以告知一下。

你可能感兴趣的:(Linux)