Linux记录用户操作记录

如下方法在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文件所有用户都可写,使用chattr命令防止用户自行修改记录, 再配合logrotate定期进行log轮替。

  1. chattr +a /var/log/command.log

 

  1. /var/log/command.log{

  2.  
  3.  prerotate
     
  4.        /usr/bin/chattr -a /var/log/command.log
     
  5.  endscript
     
  6.     compress
     
  7.     delaycompress
     
  8.     notifempty
     
  9.     rotate 1000
     
  10.     size 10M
     
  11.  postrotate
     
  12.         /usr/bin/chattr +a /var/log/command.log
  13.  endscript
     
  14. }

解释一下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'
  2. ----------------------------------------------------------------------------------------------------------------------------

 

 

----------------------------------------------------------------------------------------------------

测试环境 RHEL 5.6 bash

    linux 下可以用 w 来查看当前登录用户信息;如果是SSH登录,也可查看 $SSH_CLIENT 得到登录用户信息,但如果是FTP等方式,则无法得到需要的信息;

    但用 w 有个问题,如果是同个用户登录,则有多条信息,如果区分是个问题;最后解决方法如下:

w | tail -n +3 | awk 'BEGIN {ip="local"}{if ($5=="0.00s" || $3 != "-") ip=$3 fi} END {print ip}'

 

    linux 下可以用history 查看历史执行命令,但默认没有记录操作时间,也无法查看是哪个客户端执行的命令;

    可以用/usr/bin/script 来记录用户操作;

 

    结合以上两个功能,可以将如下命令加入到 /etc/profile里面,执行记录用户IP及操作记录;

exec /usr/bin/script -a -f -q /var/log/script/$USER-`date +%Y%m%d%H%M`-`w | tail -n +3 | awk 'BEGIN {ip="local"}{if ($5=="0.00s" || $3 != "-") ip=$3 fi} END {print ip}'`.log

 

 

linux script 记录用户命令
介绍:
  当系统工程师想要记录某个会话的时候,则只需要在会话开始时输入script命令。输入这个命令后,系统就会将当前用户的所有键盘操作、屏幕输出以及错误信息等等保存到一个特定的文件中。如上面执行了ps命令与who命令后,希望就会将这两个命令(用户的键盘操作)、屏幕输出(命令的执行结果)等等保存到文件中。当工程师需要退出记录过程时,则只需要输入exit命令,系统就会就是script done的提示信息。表示系统已经结束了记录工作.
一、操作:
[root@xen_202_18 ~]# vi /etc/profile
新增内容如下:
  if [ $UID -ge 500 ]; then
        exec /usr/bin/script -a -f -q /var/log/test/$USER-$UIDO-`date +%Y%m%d%H%M`.log
  fi
这样用户登陆后执行的操作都会记录到/var/log/test/*.log里,我们可以通过more或vi来进行查看
[root@xen_202_18 test]# ll
total 28
-rw-r--r-- 1 test test  1869 Aug 24 15:37 test--201008241536.log
-rw-r--r-- 1 test test 11681 Aug 24 16:05 test--201008241538.log
-rw-r--r-- 1 tim  tim   2048 Aug 24 15:58 tim--201008241557.log
[root@xen_202_18 test]# more test--201008241538.log
Script started on Tue 24 Aug 2010 03:38:16 PM CST
[test@xen_202_18 ~]$ ll
total 0
[test@xen_202_18 ~]$ ps -aux
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  10348   496 ?        Ss   Aug10   0:00 init [3]        
root         2  0.0  0.0      0     0 ?        S<   Aug10   0:00 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Aug10   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S<   Aug10   0:00 [watchdog/0]
root         5  0.0  0.0      0     0 ?        S<   Aug10   0:00 [events/0]
root         6  0.0  0.0      0     0 ?        S<   Aug10   0:00 [khelper]

二、script还能用scriptreplay进行回放
因为使用scriptreplay回放需要跟时间结合,所以需要使用-t进行记录时间这两个文件放置位置可以自己定义如下:
1、[root@xen_202_18 ~]# vi /etc/profile
新增内容:
if [ $UID -ge 500 ]; then
        exec /usr/bin/script -t 2>/var/log/test/$USER-$UID-`date +%Y%m%d%H%M`.date  -a -f -q /var/log/test/$USER-$UIDO-`date +%Y%m%d%H%M`.log
fi
2、scriptreplay
scriptreplay这个命令 默认情况下是不会安装的,所以我们需要做些“工作”,其实,该命令就是一个perl脚本文件
下载:
[root@xen_202_18 test]# wget http://www.linux-australia.lkams.kernel.org/pub/linux/utils/util-linux/util-linux-2.12r.tar.bz2
[root@xen_202_18 test]# tar -jxvf util-linux-2.12r.tar.bz2
[root@xen_202_18 test]# ll
-rw-r--r-- 1 test test  1869 Aug 24 15:37 test--201008241536.log
-rw-r--r-- 1 test test 11681 Aug 24 16:05 test--201008241538.log
-rw-r--r-- 1 tim  tim   2048 Aug 24 15:58 tim--201008241557.log
drwxr-xr-x 18 1000 1000    4096 Sep 24  2005 util-linux-2.12r
-rw-r--r--  1 root root 1370907 Sep 24  2005 util-linux-2.12r.tar.bz2
[root@xen_202_18 test]# cp util-linux-2.12r/misc-utils/scriptreplay.pl /usr/bin/scriptreplay
查看: 要注意那两个“时间文件”和“命令文件”的顺序,不要颠倒了
[root@xen_202_18 ophis]# scriptreplay tim-500-201008241557.date tim--201008241557.log
[tim@xen_202_18 ~]$ netstat -tuna
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN     
tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN     
tcp        0      0 192.168.202.18:22           192.168.77.31:52937         ESTABLISHED
tcp        0      0 192.168.202.18:22           192.168.77.31:55082         ESTABLISHED
tcp        0      0 192.168.202.18:22           192.168.77.31:55107         ESTABLISHED
tcp        0    284 192.168.202.18:22           192.168.77.36:57495         ESTABLISHED
udp        0      0 192.168.122.1:53            0.0.0.0:*                              
udp        0      0 0.0.0.0:67                  0.0.0.0:*                              
[tim@xen_202_18 ~]$ netstat -tunl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN     
tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN     
udp        0      0 192.168.122.1:53            0.0.0.0:*                              
udp        0      0 0.0.0.0:67                  0.0.0.0:*              
 
http://blogold.chinaunix.net/u3/116418/showart_2308042.html

你可能感兴趣的:(linux,profile,history)