习题1:找规律打印数字

要求:请详细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。
            10 31 53 77  105 141 …….

提示:相邻两个数差值的差值有规律

参考答案:

#!/bin/bash
# date: 2018年2月27日
x=10
m=21
echo -e $x " \c"
for i in `seq 0 14`
do
   n=$[2**$i]
   x=$[$x+$m]
   echo -e $x " \c"
   m=$[$m+$n]
done
echo

习题2:封IP

要求:根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!

分析: 我们要做的,不仅是要找到哪些ip请求量不合法,并且还要每隔一段时间把之前封掉的ip(若不再继续请求了)给解封。 所以该脚本的关键点在于定一个合适的时间段和阈值。

比如, 我们可以每一分钟去查看一下日志,把上一分钟的日志给过滤出来分析,并且只要请求的ip数量超过100次那么就直接封掉。 而解封的时间又规定为每半小时分析一次,把几乎没有请求量的ip给解封!

参考日志文件片段:

137.23.21.127 [20/Jan/2018:00:01:24 +0800] www.testbbs.com “/bbs/thread-5622-3-1.html” 200 “-” “Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)”

54.124.50.87 [20/Jan/2018:00:01:34 +0800] www.testbbs.com “/bbs/search.php?mod=forum&srchtxt=LNMP&formhash=8f0c7da9&searchsubmit=true&source=hotsearch” 200 “-” “Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)”

参考答案:

#!/bin/bash
# date:2018年2月27日
logfile=/home/logs/access.log
d1=`date -d "-1 minute" +%H:%M`
d2=`date +%M`
ipt=/sbin/iptables
ips=/tmp/ips.txt

block(){
    grep "$d1:" $logfile|awk '{print $1}' |sort -n |uniq -c |sort -n >$ips
    for ip in `awk '$1>50 {print $2}' $ips`; do
        $ipt -I INPUT -p tcp --dport 80 -s $ip -j REJECT
        echo "`date +%F-%T` $ip" >> /tmp/badip.txt
    done
}

unblock(){
    for i in `$ipt -nvL --line-numbers |grep '0.0.0.0/0'|awk '$2<15 {print $1}'|sort -nr`; do
        $ipt -D INPUT $i
    done
    $ipt -Z
}

if [ $d2 == "00" ] || [ $d2 == "30" ]; then
    unblock
    block
else
    block
fi

习题3:监控httpd进程

要求:在服务器上,写一个监控脚本。

    1. 每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?

    2. 若没有正常启动还需再一次启动,最大不成功数超过5次则需要理解发邮件通知管理员,并且以后不需要再检测!

    3. 如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。发邮件脚本为之前mail.py

参考答案:

#!/bin/bash
# date:2018年2月27日
email="your_mail@163.com"
check_service()
{
   n=0
   for i in `seq 1 5`
   do
        /usr/local/apache2/bin/apachectl restart 2>/tmp/apache.err
        if [ $? -ne 0 ];then
           n=$[$n+1]
        else
           break
        fi
   done

   if [ $n -eq 5 ];then
        python /root/shell/mail.py "$email" "httpd service down" "`cat /tmp/apache.err`"
   fi
}

while :
do
   t_n=`ps -C httpd --no-heading |wc -l`
   if [ $t_n -ge 500 ];then
        /usr/local/apache2/bin/apachectl restart
        if [ $? -ne 0 ];then
           check_service
        fi
        sleep 60
        t_n=`ps -C httpd --no-heading |wc -l`
        if [ $t_n -ge 500 ];then
           python /root/shell/mail.py "$email" "httpd service something wrong" "the httpd process is close..."
           exit
        fi
   fi
   sleep 10
done