day14:輸入數字執行命令|批量建立用戶|檢測nginx 進程數大於500告警|web服務器日記訪問高IP禁掉|找規律

一、寫一個腳本,輸入數字後執行對應命令:   1   date     2    ls     3 who    4 pwdpython

難點:在於用read -p 來採集用戶的數據,而後用 case 循環來判斷;linux

[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

二、在linux系統下生成user00_user_09這10個用戶,並設置隨機10位的密碼,把用戶名和密碼定向到一個文件/tmp/pw.txt裏;nginx

難點:生成密碼時,須要使用密碼生成工具 mkpasswd  -l 10 -s 4 或者用系統自帶變量 echo $RANDOM|md5sum|cut -c 1-10web

[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|md5sumshell

seq  -w  0 50    以最長的寬度爲準;表示以最後一位值得寬度爲準;                seq  0 2 10      指定步長增值2; 會打印 0 2 4 6 8bash

[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'^

二、刪除用戶:有以下兩種方法:工具

經過在/etc/passwd來過濾出第一行的用戶:     cat  /etc/passwd|grep 'use'|cut -d ':' -f 1 ;而後userdel  刪除用戶命令;spa

經過 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

三、監控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循環)了:

四、根據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

 

五、算數字:

請仔細閱讀以下數字,並使用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
相關文章
相關標籤/搜索