day14:输入数字执行命令|批量创建用户|检测nginx 进程数大于500告警|web服务器日记访问高IP禁掉|找规律

给你一囗甜甜゛ 提交于 2020-02-29 22:33:22

1、写一个脚本,输入数字后执行对应命令:   1   date     2    ls     3 who    4 pwd

难点:在于用read -p 来采集用户的数据,然后用 case 循环来判断;

[root@localhost_002 shell100]# cat 9.sh 
#!/bin/bash
echo "cmd meau** 1 - date  2 - ls 3 - who 4 - pwd"
  read -p "please input a number1-4: " n
if [ -z "$n" ]
then
    echo "The value empty"
    exit
fi
n1=`echo $n|sed 's#[0-9]##g'`
if [ -n "$n1" ]
then
    echo "you is not number;"
    exit
fi
case $n in 
   1)
    date
    ;;
   2)
    ls
    ;;
   3)
    who
    ;;
   4)
    pwd
    ;;
   *)
    echo "you is not 1-4;"
    ;;
    esac
[root@localhost_002 shell100]# sh 9.sh 
cmd meau** 1 - date  2 - ls 3 - who 4 - pwd
please input a number1-4: 2
1  1.txt  3.sh	4.sh  5.sh  6.sh  7.sh	8_1.sh	8.sh  9.sh  lanmp.sh  nohup.out

2、在linux系统下生成user00_user_09这10个用户,并设置随机10位的密码,把用户名和密码定向到一个文件/tmp/pw.txt里;

难点:生成密码时,需要使用密码生成工具 mkpasswd  -l 10 -s 4 或者用系统自带变量 echo $RANDOM|md5sum|cut -c 1-10

[root@localhost_002 shell]# echo $RANDOM|md5sum|cut -c 1-10
6fd424ad94
[root@localhost_002 shell]# mkpasswd -l 10 -s 4
z{!W96J'=e

mkpasswd  -l 10  -s  4     ( -l 密码长度  -s  特殊字符 -d 数字)   ==  echo $RANDOM|md5sum|cut -c 1-10   (RANDOM系统变量)  $RANDOM|md5sum

seq  -w  0 50    以最长的宽度为准;表示以最后一位值得宽度为准;                seq  0 2 10      指定步长增值2; 会打印 0 2 4 6 8

[root@localhost_002 shell]# seq 0 2 10
0
2
4
6
8
10

seq  -w  0 10  表示会以 10 为准, 打印 00   01   02   03   04  05   06  07   08   09   10 

脚本内容如下: 需要用for 循环,然后打印pw的密码,然后用 echo "密码" |passwd -stdin user  来更新密码,最后写入到同一个文件/tmp/pw.txt

[root@localhost_002 shell100]# cat 10.sh 
#!/bin/bash
for u in `seq -w 0 09`
  do 
    pw=`mkpasswd -l 10 -s 4`
#   pw=`echo $RANDOM|md5sum|cut -c 1-10`
    useradd use_$u
  echo "$pw"|passwd --stdin use_$u >/dev/null 2>&1
  echo "use_$u $pw" >> /tmp/pw.txt
done
[root@localhost_002 shell100]# cat /tmp/pw.txt 
use_00 MZ(~2eo,)5
use_01 6Q*9Z\}kg\
use_02 i9_U5kB:*&
use_03 VN2~_'on|5
use_04 &Y%e7"F'l1
use_05 gG[#8pI3'^

2、删除用户:有如下两种方法:

通过在/etc/passwd来过滤出第一行的用户:     cat  /etc/passwd|grep 'use'|cut -d ':' -f 1 ;然后userdel  删除用户命令;

通过 for 循环来打印,然后执行  userdel  删除用户命令;

[root@localhost_002 shell100]# cat 10_1.sh 
#!/bin/bash
for  i in `cat /etc/passwd|grep 'use'|cut -d ':' -f 1`
  do 
    userdel -r $i >/dev/null 2>&1
done

第二种方法:通过 for 循环来打印,然后执行  userdel  删除用户命令;

[root@localhost_002 shell100]# cat 10_3.sh 
#!/bin/bash
for i in `seq -w 00 50`
 do 
   userdel -r use_$i >/dev/null 2>&1
done

注释: seq 0 2 10  表示增值为2;打印 0  10;

[root@localhost_002 shell100]# seq 0 2 10
0
2
4
6
8
10

注释: echo "$pw"|passwd --stdin use_$u >/dev/null 2>&1   ==   echo  -e  "$pw\n$pw\n" |passwd use_$u

3、监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,如果大于500则自动重启httpd服务;并检测是否启动成功

如果没有正常启动还需要再启动一次,最大不成功数超过五次立即发邮件给管理员;并且不需要在检测;

如果启动成功后,1分钟后检测httpd的进程数,若正常则重启之前10s检测一次,若还是大于500则发邮件给管理员,并自动退出此脚本;

注释:  统计进程个数的命令:       ps  -C   nginx --no-heading|wc  -l         ====   pgrep   -l  nginx|wc -l

思路:每10秒检测一次,那只能用死循环 while;

检测是否启动成功的命令可以用 echo  $? 来判断返回值;

如果启动不成功,启动五次可以用计数器来判断;超过5次则发邮件告警;

[root@localhost_002 shell100]# cat 11.sh 
#!/bin/bash
check_service()
{
n=0
  for i in `seq 1 5`
  do 
   /etc/init.d/nginx restart 2>> /tmp/nginx.err
  if [ $? -ne  0 ]
  then 
     n=$[$n+1]
  else
     break
  fi
  done
  if [ $n -eq 5 ]
   then
   python mail.py "yuanhh@163.com" "The is http down" 
   exit
  fi
}
while :
 do 
 n=`pgrep -l nginx|wc -l`
  if [ $n -ge 500 ]
     then
     /etc/init.d/nginx restart
    if [ $? -ne 0 ]
       then
       check_service
      fi
     sleep 60
 t_n=`pgrep -l nginx|wc -l`
   if [ $_n -ge 500 ]
   then
      python mail.py "yuanhh@163.com" "http service is down" "the httpd is budy;"
     fi
   fi
    sleep  10
done

注释check_server 为自定义的函数,用来统计nginx 启动不成功时的计数, n 是一个计数器,每次重启不成功都会加1,超过5次后则发邮件告警退出,如果重启成功了则break(跳for循环)了:

4、根据web服务器的访问日记,把一些请求量比较高的IP给拒绝掉,并且每隔d把请求量小的IP解封;

假设:一分钟请求量高于100次的IP则不正常;  访问日记路径为/data/logs/access.log

首先需要打印出上一分钟的日记内容;t1=`date -d "-1 min" +%Y:%H:%M`

t1=`date -d "-1 min" +%Y:%H:%M`

egrep "$t1:[0-9]+"  1.log|awk '{print $1}'             #过滤出来上一分钟的日记内容;  加 号 表示一次多次;

[root@localhost_002 shell100]# cat 12.sh 
#!/bin/bash
block_ip(){
t=`date -d "-l min" +%Y:%H:%M`
logs=/usr/local/nginx/logs/access.log

  n=egrep "$t[0-9]+" 1.log > /tmp/tmp_min.log
  awk '{print $1}' /tmp/tmp_min.log|sort -n|uniq -c|sort -n|awk '$1>100 {print $2}' > /tmp/badip.list
   n-`wc -l /tmp/badip.list`
   if [ $n -ne 0 ]
   then
   for ip in `cat /tmp/badip.list`
     do
 	iptables -I INPUT -s $ip -j REJECT
   done
fi
}  
unblock_ip()
{
  iptables -nvL INPUT|sed '1,2d'|awk '$<5 print $8' > /tmp/goodip.list
  n=`wc -l /tmp/goodip.list|awk '{print $1}'`
  if [ $n -ne 0 ]
  then
  for i in `cat /tmp/goodip.list`
     do 
        iptables -D INPUT -s $ip -j REJECT
  done   
  fi
  iptables -Z

}
  d=`date +%M`
  if [ $d == "00" ] || [$d == "30" ]
  then
   unblock_ip
   block_ip
   else
   block_ip
  fi 

 

5、算数字:

请仔细阅读如下数字,并使用shell脚本输出后面的10个 数字;

10  31    53  77 105  141  .............

首先寻找规律;  寻找差值,假设第一行差值定义成   第二行差值定义成   第三行差值定义成 z

10  31     53   77    105     141

   21    22    24    28      36 

        1      2      4       8

 首先计算第三行的差值 z;  分别是2 的 0 次方   1次方   2次方   3次方;

第一行的第一个数字是10,第二行的第一个数字是21,第三行数字就是2的幂次方;做一个for 循环;

每一次循环,第二行数字数字加上第三行的差值得到第二行的下个数字,第一行的数字需要加上第一行的下一个数字,得到第一行的下一个数字;

for  i  seq `0 4`;do  z=$[2**$i];  echo  $z;done

[root@localhost_002 shell100]# for i in `seq 0 3`;do z=$[2**$i];echo $z;done
1
2
4
8

然后计算第二行的差值 ; 可知 y的初始值时21,每次在它基础上加上 2 的 n 次方;

y=21;for i in   'seq 0  4'; do  echo $y; z=$[2**2]; y=$[$y+$z];done

[root@localhost_002 shell100]# y=21;for i in `seq 0 3`;do echo $y;z=$[2**$i];y=$[$y+$z];done
21
22
24
28

x: 可知 x 的初始值是 10, 然后每次分别加上 y 的值, 求出下一个值;

x=10;y=21;for i in `seq 0 4`; do echo $x;  x=$[$x+$y];z=[2**$i];y=$[$y+$z];done

[root@localhost_002 shell100]# x=10;y=21;for i in `seq 0 4`; do echo $x;x=$[$x+$y];z=$[2**$i];y=$[$y+$z];done
10
31
53
77
105

脚本格式如下:

[root@localhost_002 shell100]# cat 15.sh 
#!/bin/bash
x=10
y=21
for i in `seq 0 10`
do 
    echo $x
    x=$[$x+$y]
    z=$[2**$i]
    y=$[$y+$z]
done

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!