尚观(awk sed高级使用)使用shell对一些非法访问ip进行报警封锁解封
作者:andyguo 博客:http://write.blog.csdn.net/postedit/8211474 转载必须注明作者和来源
#!/bin/bash
LOGPATH="/home/andyguo"LOGNAME="h_access.log"
#恢复被封闭ip时间单位是秒
TIME=50
#被封ip记录的log位置
FILENAME="/home/andyguo/msgreporter.log"
#过滤的内容
GR="GET /resume/showresumedetail"
#过滤内部特殊ip
gre_ip='27.115.103.179|58.246.147.*'
#############################报警阀值设置###############################
typeset -i H #将其设置成数字类型便于比较大小
H=10#`date '+%H'`
echo "当前时间"$H
#早上8点到下午16点为高峰时段
if([ $H -ge 8 -a $H -le 18 ])
then
echo "高峰时段"
N=1 #短信报警阀值
FN=100 #封ip的阀值
RN=1 #扫描简历报警阀值
#下午18点到23点为普通访问时段
elif([ $H -gt 18 -a $H -le 23 ])
then
echo "普通访问时段"
N=1 #短信报警阀值
FN=1 #封ip的阀值
RN=1 #扫描简历报警阀值
#其他时段
else
echo "低谷时段"
N=9 #短信报警阀值
FN=1 #封iP的阀值
RN=1 #扫描简历报警阀值
fi
echo "报警阀值" $N
echo "封ip阀值" $FN
echo "扫描简历阀值" $RN
##########################时间段截取###################################
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
#############################################################################
MSG="$LOGNAME: "
BOOL=0 #判断是否发短信
for ((i=1;i<=3;i++))
do
msg=`cat $LOGNAME |awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME '{if ($3>=date2 && $3<=date1) print}'|awk '{print $1}'|grep -v -|egrep -v $gre_ip |sort|uniq -c|sort -nr|sed -n ${i}p |awk -v n=$N '{if ($1>n) print "ip="$2"("$1")"}'`
if [ -n "$msg" ];then
BOOL=1
fi
MSG=$MSG$msg" "
done
echo "普通报警: " $MSG
echo "普通报警:"$MSG >>/var/log/$LOGNAME
for phone_num in 13810697234
#for phone_num in 13810697234
do
echo "发短信"
# wget -O /dev/null "http://127.0.0.1/sms/send?view_id=0&client_id=1004&data=[{%22tel%22:%22$phone_num%22,%22context%22:%22$SEND_MSG.[testcom]%22,%22kind%22:%2206%22}]"
done
fi
######################################
SEND_MSG="$LOGNAME "
SEND_BOOL=0
for ((i=1;i<=3;i++))
do
send_msg=`cat $LOGNAME |grep "$GR"|awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME '{if ($3>=date2 && $3<=date1) print}'|awk '{print $1}'|grep -v -|egrep -v $gre_ip|sort|uniq -c|sort -nr|sed -n ${i}p |awk -v n=$RN '{if ($1>n) print "ip="$2"("$1")"}'`
if [ -n "$send_msg" ];then
SEND_BOOL=1
fi
ip=`echo $send_msg |awk -F "(" '{print $1}'|awk -F "=" '{print $2}'`
userid_nu=`cat $LOGNAME |awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME '{if ($3>=date2 && $3<=date1) print}'|grep "$ip"|grep "$GR"|awk -F '\t' '{print $11}'|grep -v "0"|sort|uniq -c|wc -l`
SEND_MSG=$SEND_MSG$send_msg"(""$userid_nu"")"
done
echo "抓简历报警: "$SEND_MSG
echo "抓简历报警:"$SEND_MSG >>/var/log/$LOGNAME
if [ $SEND_BOOL == 1 ];then
for phone_num in 13810697234
#for phone_num in 13810697234
do
echo "发短信"
# wget -O /dev/null "http://127.0.0.1/sms/send?view_id=0&client_id=1004&data=[{%22tel%22:%22$phone_num%22,%22context%22:%22$SEND_MSG.[testcom]%22,%22kind%22:%2206%22}]"
done
fi
######################################
#被封闭ip地址和时间记录的文件名称和地址
#现在时间
now=`date "+%Y-%m-%d %H:%M:%S"`
echo "封ip的时间:" $now
IPTABLES_MSG="$LOGNAME: "" unable visit ip "
IPTABLES_BOOL=0
for((i=1;i<=3;i++))
do
iptables_msg=`cat $LOGNAME |awk -F \/ -v date1=$STARTTIME -v date2=$ENDTIME '{if ($3>=date2 && $3<=date1) print}'|awk '{print $1}'|grep -v -|egrep -v $gre_ip|sort|uniq -c|sort -nr|sed -n ${i}p |awk -v n=$FN '{if ($1>n) print $2"("$1")"}'`
if [ -n "$iptables_msg" ];then
ip=`echo $iptables_msg|awk -F "(" '{print $1}'`
IPTABLES_BOOL=1
echo "封闭ip和时间"${ip}";"${now}
echo ${ip}";"${now}>> $FILENAME
echo "封闭IP:"$ip
`/sbin/iptables -I INPUT -s ${ip} -p tcp --dport 80 -j DROP`
fi
IPTABLES_MSG=$IPTABLES_MSG$iptables_msg" "
done
echo $IPTABLES_MSG
echo $IPTABLES_MSG >>/var/log/$LOGNAME
if [ $IPTABLES_BOOL == 1 ];then
for phone_num in 13810697234
#for phone_num in 13810697234
do
echo "发短信"
# wget -O /dev/null "http://127.0.0.1/sms/send?view_id=0&client_id=1004&data=[{%22tel%22:%22$phone_num%22,%22context%22:%22$SEND_MSG.[testcom]%22,%22kind%22:%2206%22}]" done
fi
######################################
#计算时间差
typeset -i result
#现在时间
now=`date "+%Y-%m-%d %H:%M:%S"`
echo "解封ip时间:" $now
end=`date +%s -d "$now"
while read LINEdo
startime=`echo $LINE |awk -F ";" '{print $2}'`
star=`date +%s -d "$startime"`
result=$(($end-$star))
if([ $result -ge $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" $FILENAME
echo $LINE
fi
done < $FILENAME
附件