shell 高级学习成果分享

#/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

你可能感兴趣的:(shell)