Linux Shell DAY14

11.输入数字执行命令

12.批量创建用户

13.监控httpd进程

14.封ip

15.算数字


输入数字执行命令

题目要求

写一个脚本实现如下功能:  输入一个数字,然后运行对应的一个命令。

显示命令如下:

cmd meau*  1 - date 2 - ls 3 - who 4 - pwd 当输入1时,会运行date, 输入2时运行ls, 以此类推。

核心要点

case判断

代码

#!/bin/bash

echo "\*cmd meau\*\*  1 - date 2 - ls 3 - who 4 - pwd"   #提示用户输入命令 

read -p "Please input a number: " n

if \[ -z "$n" \]                                        #判断出入为空

then

    echo "请输入一个纯数字,范围1-4."

    exit

fi

n1=\`echo $n|sed 's/\[0-9\]//g'\`

if \[ -n "$n1" \]                                       #判断是否是数字

then

    echo "请输入一个纯数字,范围1-4."

    exit

fi

case $n in

    1)

        date

        ;;

    2)

        ls

        ;;

    3)

        who

        ;;

    4)

        pwd

        ;;

    *)

        echo "请输入1-4的数字"

        ;;

esac

批量创建用户

题目要求

用shell脚本实现如下需求:

添加user_00 – user_09 10个用户,并且给他们设置一个随机密码,密码要求10位包含大小写字母以及数字,注意需要把每个用户的密码记录到一个日志文件里。   提示:

  1. 随机密码使用命令 mkpasswd

  2. 在脚本中给用户设置密码,可以使用echo 然后管道passwd命令

核心要点
  • seq实现数字递增

  • mkpasswd产生随机字符

代码

#!/bin/bash

for i in \`seq -w 00 09\`                              # -w 实现00-09

do

    useradd user_$i

    p=\`mkpasswd -l 10 -s 0 \`

    echo "user_$i $p" >> /tmp/pass.tmp

    echo $p |passwd --stdin user_$i

done

监控httpd进程

题目要求

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

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

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

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

核心要点
  • pgrep -l httpd或者ps -C httpd --no-heading检查进程

  • for循环5次计数器

代码

#!/bin/bash

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

        ##下面的mail.py参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py

        python mai.py "123@qq.com" "httpd service down" \`cat /tmp/apache.err\`

        exit

    fi

}   

while true

do

    t_n=\`ps -C httpd --no-heading |wc -l\`                             #计算httpd进程数量

    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 mai.py "123@qq.com" "httpd service somth wrong" "the httpd process is busy."

            exit

        fi

    fi

    sleep 10

done

封ip

题目要求

需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!并且每隔半小时把不再发起请求或者请求量很小的ip给解封。   假设: 

  1. 一分钟内请求量高于100次的IP视为不正常请求。

  2. 访问日志路径为/data/logs/access_log。

用第2例中的1.log作为演示日志

核心要点
  • 统计ip访问次数,排序

  • 如何标记每隔半小时

  • iptables计数器是一个重要的判断指标

  • 函数(封IP、解封IP)

代码

#!/bin/bash

block_ip()

{

t1=\`date -d "-1 min" +%Y:%H:%M\`              #上一分钟的时间

log=/data/logs/access_log

egrep "$t1:\[0-9\]+" $log > /tmp/tmp\_last\_min.log

awk '{print $1}' /tmp/tmp\_last\_min.log |sort -n |uniq -c|sort -n |awk '$1>100 {print $2}' > /tmp/bad_ip.list

n=\`wc -l /tmp/bad_ip.list|awk '{print $1}'\`                                                     # 文件行数

if \[ $n -ne 0 \]

then

    for ip in \`cat /tmp/bad_ip.list\`

    do

        iptables -I INPUT -s $ip -j REJECT

    done

fi

}

unblock_ip()

{

    iptables -nvL INPUT|sed '1d' |awk '$1<5 {print $8}' > /tmp/good_ip.list

    n=\`wc -l /tmp/good_ip.list|awk '{print $1}'\`

    if \[ $n -ne 0 \]

    then

    for ip in \`cat /tmp/good_ip.list\`

    do

        iptables -D INPUT -s $ip -j REJECT

    done

    fi

    iptables -Z                                                      #把input数值清空,计数器从零开使

}

t=\`date +%M\`

if \[ $t == "00" \] || \[ $t == "30" \]

then

   unblock_ip                                                       #先解封,再封Ip 

   block_ip

else

   block_ip

fi

算数字

题目要求

请仔细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。

10 31 53 77  105 141 …….

x=10 31.。。

y= 21 22 23。。。。

z= 1 2 3 。。。。。

核心要点
  • 计算两个数值之间的差值

代码

#!/bin/bash

x=10

y=21

for i in \`seq 0 15\`

do

    echo $x

    x=$\[$x+$y\]

    z=$\[2**$i\]

    y=$\[$y+$z\]

done

转载于:https://my.oschina.net/u/3959701/blog/3099977

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值