监控用户行为的脚本

监控该用户 执行了 哪些指令 。 管理员能够看到 用户 所有的 操作指令。--------通过 -------》 .bash_history

history 命令记录的机制:

.bash_history --》 内存
|
新的运行指令------》 内存添加 -----》 history -c history -a
|
logout 退出
|
内存的修改 同步 到磁盘
示例 :zhang3

    添加过程 :============
    1、 test  -f  /home/zhang3/.bash_profile   
          echo  'PROMPT_COMMAND="history -a;readonly PROMPT_COMMAND" ; export  PROMPT_COMMAND' >> /home/zhang3/.bash_profile  
     
    2、 chattr  +i  /home/zhang3/.bash_profile
    
    3、 touch  /home/zhang3/.bash_history 
    4、 chown  zhang3  /home/zhang3/.bash_history
    6、 charrt +a  /home/zhang3/.bash_history 


    撤销 过程 :============

     chattr  -a  /home/zhang3/.bash_history
     chattr -i   /home/zhang3/.bash_profile
     sed -i  '/PROMPT_COMMAND/{d}' /home/zhang3/.bash_profile
     sed  '/\/{d}'  -i   /root/user.list
        

    降低脚本冗余度过程 ============

    sed  -i '{s#/home/\$name/\.bash_history#\$his#g}' /test/mon-user.sh
    sed  -i '{s#/home/\$name/\.bash_profile#\$pro#g}'  /test/mon-user.sh

    整理结构的过程 :=============
    
        用 函数 来实现 某个 具体的  功能。
        
        [function] fun1(){
           cmd1
           cmd2
        [return  整数信号]
        }
        
        fun1
        
        #调用函数 , 调用后  $?  取什么值
        # 如何判定该函数是否执行成功? 如何取得函数的返回值。
        # 如果没有专门 自定义 return ,则会将  函数的 最后一条执行 语句 的 $?  作为返回值。

成品参考 ========================================

[root@server-18 ~ ]# cat /test/mon-user.sh

#!/bin/bash

read -p "请输入要操作的用户名:" name
id $name >/dev/null 2>&1

if [ $? -ne 0 ]
then
	echo "您输入的用户不存在..."
	exit 1
fi

list=/root/user.list
his="/home/$name/.bash_history"
pro="/home/$name/.bash_profile"
touch $list

add(){
	count=`grep "^\<$name\>$" $list | wc -l`
        if [ $count -ne 0  ]
        then
                echo "$name 已经处于监控状态,不做任何操作..."
                exit 2
        fi
        echo "正在实施监控..."
        echo 'PROMPT_COMMAND="history -a;readonly PROMPT_COMMAND" ; export  PROMPT_COMMAND' >> $pro
        chattr +i $pro
        test -f $his || touch $his
        chown $name  $his
        chattr +a $his
        echo "$name" >> $list
        echo "$name 监控实施完成!"
}


del(){
	count2=`grep "^\<$name\>$" $list | wc -l`
        if [ $count2 -eq 0 ]
        then
                echo "$name 未处于监控状态,不做任何操作..."
                exit 2
        fi
         echo "正在取消监控..."
         chattr -a  $his
         chattr -i  $pro
         sed -i '/PROMPT_COMMAND/{d}' $pro
         sed -i '/\<'$name'\>/{d}' $list
         echo "$name 监控取消完成..."
}


read  -p "添加监控请输入 [y]   取消监控请输入 [n] :" ans

if [ "$ans" == "y" ] 
then
        add
elif [ "$ans" == "n" ]
then
	del
else
	echo "请输入正确字符 y / n"
	exit 1
fi

你可能感兴趣的:(Linux运维)