Chinaunix首页 | 论坛 | 博客
  • 博客访问: 848779
  • 博文数量: 581
  • 博客积分: 7803
  • 博客等级: 少将
  • 技术积分: 3653
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-27 08:21
文章分类

全部博文(581)

文章存档

2013年(7)

2012年(414)

2011年(159)

2009年(1)

分类:

2011-12-13 12:25:43

原文地址:记录用户操作记录 作者:power562

如下方法在centos5.x系统中通过.

在/etc/profile文件里加入如下语句:
1)使用script记录UID大于500的用户的所有操作,类似屏幕截图 
    1. if [ $UID -gt 500 ]
    2. then
    3.     exec /usr/bin/script -t 2>/tmp/$USER-$UID-$(date +%Y%m%d%H%M).date -a -f -q /tmp/$USER-$UID-$(date +%Y%m%d%H%M).log
    4. fi
    script 可以把当前用户的所有键盘操作、屏幕输出以及错误信息等等保存到一个文件中;
    使用exec可以防止用户自行退出script,当输入exit退出时,会连当前的终端一起关掉;exec还有执行完当前命令就退出当前shell的特性,也就是说,要把exec命令放在profile最后一行执行,因为exec后面的命令都执行不到。
    为什么执行了上边的命令没有退出当前shell呢,因为script命令一直在持续运行,也就是说在持续记录用户的操作,并不是说执行一次马上就结束了。
    -a  用append的形式在文件中追加,若不适用此参数,同名的记录文件会被覆盖,而且没有提示;
    -f Flush output after each write;
    -q be quiet
    -t 生成时间文件,有了这个文件,可以使用 scriptreplay 命令回放;
    如:scriptreplay username-500-201111262310.date username-500-20111126231.log
       要注意“时间文件”和“记录文件”的顺序,不要颠倒了;
    要保证该文件当前登录用户可写,不然无法正常记录!
    因为文件是实时更新的,如果tail、more自己的记录文件,会形成很有意思的无限循环。

2)使用环境变量记录用户操作
在/etc/profile和/etc/bashrc中添加以下命令,并 source 一次
  1. export PROMPT_COMMAND='{ date "+[ %Y%m%d %H:%M:%S `whoami` ] `history 1 | { read x cmd; echo "$cmd"; }`"; } >> /var/log/command.log'
这条命令会把登录用户所有按回车输入的内容都记录到command.log文件中去,即使是敲错的命令也一样;
要保证command.log文件所有用户都可写,权限定为222比较合适,这样其他用户只能写,但是查看不了内容。最后使用chattr命令防止用户自行修改记录或删除文件,
  1. chattr +a /var/log/command.log
再配合logrotate定期进行log轮替。
  1. /var/log/command.log{

     prerotate
           /usr/bin/chattr -a /var/log/command.log
     endscript
        compress
        delaycompress
        notifempty
        rotate 30
        size 10M
        create 0222 root root
     postrotate
            /usr/bin/chattr +a /var/log/command.log
     endscript
    }
解释一下PROMPT_COMMAND环境变量,这个变量会优先于 PS1 变量执行,屏幕上显示完PROMPT_COMMAND定义的内容后,才会显示 PS1 提示符的内容;也就是说,按回车后,先输出 PROMPT_COMMAND 的内容到屏幕上,然后才输出 PS1 ;上边给出的命令因为做了重定向,所以不会输出到屏幕上,而是command.log文件中。

注:在 /etc/bashrc 文件中有对 PROMPT_COMMAND 变量进行赋值,会把/etc/profile中添加的PROMPT_COMMAND 变量值覆盖掉(为什么会覆盖掉请参考我以前的一篇文章 《bash中profile等配置文件执行顺序”》),所以要在 /etc/bashrc 中的最后也添加以上命令。因为在  ~/.bashrc 中有一个判断并调用/etc/bashrc的内容,为了保证肯定能够执行到这个命令,要在/etc/profile和/etc/bashrc中都添加以上命令。

3)其实可以根据自己的需要输出不同的内容,比如下边的命令,记录了更加详细的信息。自己编写时,需要注意命令中的单双引号嵌套,很容易因为引号的配对问题出现命令不能通过的问题。
  1. export PROMPT_COMMAND='{ date +"%Y%m%d %H:%M:%S [$(who am i | tr -s [[:blank:]] | cut -d" " -f1,2,5)-> ${USER}] $( history 1 | { read num cmd; echo ${cmd}; })" ; } >> /var/log/command.log'

阅读(574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~