shell 高级学习成果分享

来源:互联网 发布:淘宝搜不到变声软件 编辑:程序博客网 时间:2024/06/06 02:04
#/bin/bash
#log的路径
LOGPATH="/home/andyguo"
#log的名称
LOGNAME="h_access.log"
#user_id保存的时间
TIME=360
#user_id超过阀值记录的文件名称
USER_ID_FILE="/home/andyguo/resumedog.log"
IPTABLES_FILE="/home/andyguo/iptables.log"
#过滤的内容
GR="GET /rasdfadsfas"
#同一user_id在10分钟内报警阀值
UFN=1
##########################时间段截取###################################
Y=`date '+%Y:'`
STARTTIME=$Y` date -d   ' minutes' |awk '{print $4}'`
ENDTIME=$Y`date -d ' -9 minutes'|awk '{print $4}'`
STARTTIME="2012:16:04:33"
ENDTIME="2012:16:00:33"
echo "开始时间:" $STARTTIME
echo "结束时间:"$ENDTIME
cd $LOGPATH
################解除封闭的ip######################
#计算时间差
typeset -i result
#现在时间
now=`date "+%Y-%m-%d %H:%M:%S"`
echo  "解封ip时间:" $now
end=`date +%s -d "$now"`

while read LINE
do
        startime=`echo $LINE |awk  -F ";" '{print $2}'`
        star=`date +%s -d "$startime"`
        result=$(($end-$star))
        if([ $result -ge $IPTABLES_TIME ]);then
            ip=`echo $LINE |awk  -F ";" '{print $1}'`
            echo "封闭ip离现在已经"$result"秒"
            echo "清除ip"$ip
            `/sbin/iptables -D INPUT -s $ip -p tcp --dport 80 -j DROP`
             sed -i -e "/$LINE/d" $IPTABLES_FILE
             echo $LINE
       fi
done < $IPTABLES_FILE
############################################
now=`date "+%Y-%m-%d %H:%M:%S"`
id_msg=""
for ((i=1;i<=3;i++))
 do
   echo $id_msg      
   id=`echo $id_msg|awk -F";" '{print $1}'`
   if [ -n "$id_msg" ];then
         echo $id_msg";"$ip";"$now>> $USER_ID_FILE
         echo $id_msg";"$ip";"$now
    fi
done

#获取够条件的USER_ID

user_ids=`cat $USER_ID_FILE |awk -F ";" '{print $1}'|sort|uniq -c |sort -nr|awk '{if ($1>=3) print $2}'`

echo "满足条件的user_id:" $user_ids

if [ -n "$user_ids" ];then
  id_num=`echo $user_ids |awk '{print NF}'`
  for((i=1;i<=$id_num;i++))
    do
     user_id=`echo $user_ids|awk -v i=$i '{print $i}'`
     echo $user_id
     ips=`cat $USER_ID_FILE |grep $user_id|awk -F";" '{print $3}'|sort|uniq`
     echo "满足条件的ip" $ips
     ip_num=`echo $ips |awk '{print NF}'`
     for((j=1;j<=$ip_num;j++))
       do
           ip=`echo $ips|awk -v j=$j '{print $j}'`
           echo ${ip}";"${now}>> $IPTABLES_FILE
           echo "封闭IP:"$ip
           `/sbin/iptables -I INPUT -s ${ip} -p tcp --dport 80 -j DROP`
           #ip封闭后需要从user_id文件中删除,防止重复封闭ip
           sed -i -e "/$ip/d" $USER_ID_FILE
      done
   done
fi
################删除1小时之前的######################
#计算时间差
typeset -i result
#现在时间
now=`date "+%Y-%m-%d %H:%M:%S"`
echo  "解封ip时间:" $now
end=`date +%s -d "$now"`
while read LINE
do
        startime=`echo $LINE |awk  -F ";" '{print $4}'`
        star=`date +%s -d "$startime"`
        result=$(($end-$star))
        if([ $result -ge $TIME ]);then
            echo "该user_id离现在已经"$result"秒"
            echo "清除该user_id的记录"$LINE
            sed -i -e "/$LINE/d" $USER_ID_FILE
            echo $LINE
       fi
done < $USER_ID_FILE