工作中,需要把用户执行的每一个命令都记录下来,并发送到日志服务器的需求,为此我做了一个简单的解决方案。这个方案会在每个用户退出登录时,把用户所执行的每一个命令都发送给日志守护进程rsyslogd,你也可通过配置“/etc/rsyslog.conf”进一步将日志发送给日志服务器。
***种方法
- # vi /etc/profile
- #设置history格式
- export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] "
- #记录shell执行的每一条命令
- export PROMPT_COMMAND='\
- if [ -z "$OLD_PWD" ];then
- export OLD_PWD=$PWD;
- fi;
- if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then
- logger -t `whoami`_shell_cmd "[$OLD_PWD]$(history 1)";
- fi ;
- export LAST_CMD="$(history 1)";
- export OLD_PWD=$PWD;'
下面是第二种方法,较笨
***步:全局设置(这是一次性设置,需要root用户权限)
命令# vi /etc/profile
- #用户登录时执行此脚本
- #设置history显示格式
- export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] "
- #登录时清空当前缓存
- echo "" > .bash_history
第二步:不同用户分别设置
命令# source /etc/profile
命令# vi /home/user1/.bash_logout
- #当用户退出登录时会执行此脚本
- tmpfile="/tmp/`whoami`_history.tmp"
- #把格式化的history记录到文件里
- history > $tmpfile
- #读取文件,一行一行把文件内容发送到给syslogd。
- #不要试图用"history | logger"或"logger -f $tmpfile"来替代下面的代码,否则将只能记录前200行。
- k=1
- while read line; do
- ((k++))
- logger -t `whoami`_shell_cmd "$line"
- done < $tmpfile
- rm -f $tmpfile
(如果还有其它用户需要监控,则重复第二步骤)
第三步:把日志发送给远程主机(可选)
- # vi /etc/rsyslog.conf
- #增加如下行,IP自己换,也可以用域名,@表示用UDP协议,@@表示用TCP协议
- *.* @192.168.0.1
不足之处:
1. 不能实时记录命令并发送log
2. 要记录终端桌面下的命令需要重启。