在工作中,需要记录用户执行的每一条命令,并发送到日志服务器。为此,我做了一个简单的解决方案。当每个用户注销时,此解决方案会将用户执行的每个命令发送到日志守护程序rsyslogd。还可以通过配置“/etc/rsyslog.conf”进一步将日志发送到日志服务器。第一种方法#vi/etc/profile#设置历史格式exportHISTTIMEFORMAT="[%Y-%m-%d%H:%M:%S][`whoami2>/dev/null|awk'{print$NF}'|sed-e's/[()]//g'`]"#记录shell执行的每条命令exportPROMPT_COMMAND='\if[-z"$OLD_PWD"];thenexportOLD_PWD=$PWD;fi;if[!-z"$LAST_CMD"]&&["$(history1)"!="$LAST_CMD"];thenlogger-t`whoami`_shell_cmd"[$OLD_PWD]$(history1)";fi;exportLAST_CMD="$(history1)";exportOLD_PWD=$PWD;'下面是第二种方法,比较笨。第一步:全局设置(此为一次性设置,需要root用户权限)命令#vi/etc/profile#用户登录时执行此脚本#设置历史显示格式exportHISTTIMEFORMAT="[%Y-%m-%d%H:%M:%S][`whoami2>/dev/null|awk'{print$NF}'|sed-e's/[()]//g'`]"#清空当前登录时缓存echo"">.bash_history第二步:分别为不同用户设置命令#source/etc/profilecommand#vi/home/user1/.bash_logout#当用户退出时会执行该脚本tmpfile="/tmp/`whoami`_history.tmp"#将格式化后的历史记录到文件history>$tmpfile#读取文件,并将文件内容逐行发送给syslogd。#不要尝试用“history|logger”或“logger-f$tmpfile”来代替下面的代码,否则只会记录前200行。k=1whilereadline;do((k++))logger-t`whoami`_shell_cmd"$line"done<$tmpfilerm-f$tmpfile(如果还有其他用户需要监控,重复第二步)第三步:log发送toremotehost(optional)#vi/etc/rsyslog.conf#添加下面一行,IP自己改,或者使用域名,@表示使用UDP协议,@@表示使用TCP协议*.*@192.168.0.1是不足缺点:1.不能实时记录命令和发送log2。在终端桌面下记录命令,需要重启。
