注:本文基于CentOS6.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 /]#
借助这一特点linux 和 su 的使用 环境变量详解,我们可以把用户执行的命令记录出来,甚至通过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手指定,这儿记录了命令执行的用户linux 和 su 的使用 环境变量详解linux移植,进程号,具体命令,以及命令返回值。
将PROMPT_COMMAND设置为readonly的缘由是由于,有些用户可以通过重设PROMPT_COMMAND的值来改变我们记录操作的行为,设置为只读后就难以更改。除非删掉/etc/bashrc里的设置,并重新开一个工作窗口。
B、添加syslog配置
前面说到logger指定了日志级别linux deepin,因而我们要在对应的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远程执行命令的情况。
其实也有可能我没有配置好,有晓得的希望可以告知一下。