shell训练计划30天之第十四天

例11 输入数字执行命令

要求:写一个脚本实现如下功能:输入一个数字,然后运行一个命令,显示命令如下:*cmd meau** 1-date 2-ls 3-who 4-pwd

当输入1时,会运行date,输入2时运行ls,以此类推

要点

case

 

 

 

#!/bin/bash

read -p "Please input a number:" n

if [ -z "$n" ]

then

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

exit

fi

n1=`echo $n1|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

 

 

例12 批量创建用户

要求:用shell脚本实现如下需求

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

提示

随机密码使用命令mkpasswd

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

核心

seq实现数字递增

mkpasswd产生随机字符 mkpasswd -l 10 -s 0 //不加特殊字符

 

#!/bin/bash/

for i in `seq -w 00 09`

do

user add_$i

p=`mkpasswd -l 10 -s 0 `

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

echo $p | passwd --stdin user_$i

done

 

删除

for i in `seq -w 00 09`;do userdel -r user$i;done

 

 

例13 监控httpd进程

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

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

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

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

要点

pgerp -l httpd 或者 ps -C httpd --on-heading检查进程

如何计数5次

 

 

#!/bin/bash

check_service()

{

c=0

for i in `seq 1 5`

do

/usr/local/apache2/bin/apachectl -k restart 2> /tmp/httpd.err

if [ ! $? -eq 0 ]

then

c=$[$c+1]

else

break

fi

done

if [ $c -eq 5 ]

then

python mail.py 123@123.com "apache 进程数量超过500,重启失败" "head -1 /rmp/httpd.err"

exit

fi

}

while:

do

n=`ps -C httpd --no-heading|wc -l`

if [ $n -ge 500]

then

check_service

sleep 60

n_new=`ps -C httpd --no-heading|wc -l`

if [ $n_new -ge 500 ]

then

python mail.py 123@123.com "apache 重启一分钟后进程数量仍然大于500" " 请登录服务器排查问题"

exit

fi

fi

sleep 10

done

 

例14 封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_lase_min.log | sort -n | uniq -c | sort -n | awk '$1>100 {print $2}' >/tmp/bad_ip.list

 

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/goof_ip.list | awk '{print $1}'`

then

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

 

do

iptables -D INPUT -s $ip -j REJECT

done

iptables -Z INPUT

}

 

t=`date +%M

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

then

 

 

 

unblock_ip

block_ip

else

block_ip

fi

 

 

 

例15 算数字

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

10 31 53 77 105 141

计算两个数之间的差值

#!/bin/bash

x=10

y=21

for in `sqe 0 15`

do

echo $x

x=$[$x+$y]

z=$[2**$i]

y=$[$y+$z]

done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值