日期:2014-05-16  浏览次数:20663 次

请教抓取所有用户的命令执行日志(带执行时间)
大家好,我想配置自动收集每个用户登录系统后的命令执行记录(带有命令执行时间格式的命令执行记录,直接运行history是只显示命令记录,没有命令执行的时间)
我在 /etc/profile 加入以下脚本:
export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] "
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
HISTDIR=/var/log/cmd_audit
if [ -z $USER_IP  ]
then
  USER_IP=`hostname`
fi
if [ ! -d $HISTDIR ]
then
   mkdir -p $HISTDIR
   chmod 755 $HISTDIR
fi
if [ ! -d $HISTDIR/${LOGNAME} ]
then
    mkdir -p $HISTDIR/${LOGNAME}
    chmod 644 $HISTDIR/${LOGNAME}
fi
export HISTFILESIZE=3000
export HISTSIZE=3000
DT=`date +%Y%m%d_%H%M%S`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.hist.$DT"
chmod 600 $HISTDIR/${LOGNAME}/*.hist* 2>/dev/null

之后,重登录系统后,发现执行history命令是可以显示带有执行时间格式的命令记录了,如下:
CA-SERVER:~ # history
    1  [2013-01-10 21:46:45] ls -ltr ls -ltr /var/log/cmd_audit/root/192.168.139.1.hist.20130110_211123
    2  [2013-01-10 21:46:53] ls -ltr /var/log/cmd_audit/root/192.168.139.1.hist.20130110_211123
    3  [2013-01-10 21:49:47] echo $HISTFILE
    4  [2013-01-10 21:52:47] history
但,执行history命令时,只会显示本次登录所操作的命令记录,不会包括之前登录操作的命令记录,而且
HISTFILE环境变量里指定的命令记录文件,如以上的 /var/log/cmd_audit/root/192.168.139.1.hist.20130110_211123 文件时
显示的都只有命令,是没有命令执行时间格式的,必须要在当前用户下再次执行 history 命令才会显示带有执行时间格式的命令记录,而且只会显示本次登录的
命令记录。具体你可以将以上脚本放在/etc/profile,重新登录测试一下。

如果要查看其它用户的命令执行记录,还要登录或su到其它用户中,再执行history命令才能显示,这样很不方便,也不现实。
我想实现的功能和以上类似,用户每次登录系统后,生成$HISTDIR/${LOGNAME}/${USER_IP}.hist.$DT 这样格式的命令记录文件,
但$HISTDIR/${LOGNAME}/${USER_IP}.hist.$DT这个文件是要直接包括用户本次登录系统操作的带有命令执行时间的命令记录,格式如下(命令执行时间         执行的命令):
[2013-01-10 21:46:45] ls -ltr /tmp
[2013-01-10 21:46:50] top
---
而不是要登录到各个用户下再运行history收集各个用户的命令执行记录,请问这具体具体该如何实现?


待复,感谢!

------解决方案--------------------
把后面几行改成这样:

export HISTTIMEFORMAT="%F %T $USER_IP:`whoami` "
export HISTFILESIZE=3000
export HISTSIZE=3000
DT=`date +%Y%m%d_%H%M%S`
export HISTFILE="$HISTDIR/${LOGNAME}/.bash_history"
chmod 600 $HISTDIR/${LOGNAME}/*.hist* 2>/dev/null

这样的话,历史记录文件被固定为.bash_history,而不是你的配置代码中的变量(也正是因为这个变量的问题,导致每次exit后重新登录后,history的记录文件发生了变化,所以你重新登录后,执行history只会显示本次登录的历史记录,使用常量例如这里的.bash_history可以解决这个问题)。
然后所有用户的命令全部被集中在/var/log/cmd_audit/ 路径先,不同的用户占有各自用户名命名的文件夹
------解决方案--------------------
DT=`date +%Y%m%d_%H%M%S`这行可以删掉