1. 程式人生 > >shell實戰訓練營Day14

shell實戰訓練營Day14

輸入數字執行命令
輸入1執行 date命令
輸入2執行 ls命令

可以使用case判斷

#!/bin/bash
echo "cmd manu 1 date 2 ls 3 pwd"
read -p"please input a number;" n
if [ -z $n ]
then
echo "shuruyigeshuzi"
exit
fi
n1=echo $n|sed 's/[0-9]//g'
if
[ -n $n1 ]
then
echo "shuruyigechushuzi"
exit
fi

case $n in
1)
date
;;
2)
ls
;;
3)
pwd
;;
*)
echo "range 1-4"
;;
esac

新增user_00-user_09,並設定隨機密碼,密碼要求10位,幷包含數字及大小寫字母,注意要把每一個使用者密碼記錄到一個日誌檔案中。

mkpasswd
在指令碼中設定隨機密碼 可以使用echo|passwd 命令
seq實現數字遞增
mkpasswd生成隨機字元

#!/bin/bash
for i in seq -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
#for i in seq -w 00 09;do userdel -r user
$i;done

伺服器上,寫一個監控指令碼,要求如下:

每隔10s去檢測一次伺服器上的httpd程序數,如果大於等於500的時候,就需要自動重啟一下apache服務,並檢測啟動是否成功。

若沒有正常啟動還需再一次啟動,最大不成功數超過5次則需要立即發郵件通知管理員,並且以後不需要再檢測!

如果啟動成功後,1分鐘後再次檢測httpd程序數,若正常則重複之前操作(每隔10s檢測一次),若還是大於等於500,那放棄重啟並需要發郵件給管理員,然後自動退出該指令碼。假設其中發郵件指令碼為之前使用的mail.py

核心要點
pgrep -l httpd或者ps -C httpd --no-heading檢查程序
for迴圈5次計數器

#!/bin/bash

jianchafuwu()
{
c=0
for i in seq 1 5
do
/usr/local/apache2.4/apachectl -l restart 2 > /tmp/httpd.err
if [ ! $? -eq 0 ]
then
c=$[$c+1]
else
break
fi
done
if [ $c -eq 5 ]
then
python mail.py

[email protected] "httpd程序數大於500重啟失敗" "head -1 /tmp/httpd.err"
exit
fi
}

while :
do
n=ps -C httpd --no -heading|wc -l
if [ $n -ge 500 ]
then
jianchafuwu
sleep 60
n1=ps -C httpd --no -heading|wc -l
if [ $n1 -ge 500 ]
then python mail.py [email protected] "apache重啟1分鐘後進程數大於500" "請排查問題"
exit
fi
fi
sleep 10
done

需求: 根據web伺服器上的訪問日誌,把一些請求量非常高的ip給拒絕掉!並且每隔半小時把不再發起請求或者請求量很小的ip給解封。 假設:

一分鐘內請求量高於100次的IP視為不正常請求。

訪問日誌路徑為/data/logs/access_log。

用第2例中的1.log作為演示日誌

核心要點
統計ip訪問次數,排序
如何標記每隔半小時
iptables計數器是一個重要的判斷指標
函式(封IP、解封IP) 日誌檔案為1.log

#!/bin/bash
block_ip()
{
t1=date -d "-1 min" +%Y:%H:%M
log=/shell100/1.log
egrep "$t1[0-9]+"$log >/tmp/tmp_last_min.log
awk '{print $1}' 1.log|sort -n|uniq -c|sort -n|awk '$2>100 {print}' > /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 REJECE
done
fi
}

unblock_ip ()
{
iptables -nvL INPUT |sed '1d'|awk '$1<5 {print $8}'>/tmp/goog.ip_list
n=wc -l /tmp/goog.ip_list|awk '{print $1}'
if [ $n -ne 0 ]
then
for ip in cat /tmp/good_ip.list
do
iptabls -D INPUT -s $ip -j REJECT
done
fi
iptables -Z
}

t=date +%M
if [ $t == "00" ]||[ $t == "30" ]
then
unblock_ip
block_ip
else
block_ip
fi
#將指令碼新增到計劃任務 crontab

請仔細檢視如下幾個數字的規律,並使用shell指令碼輸出後面的十個數字。

10 31 53 77 105 141 …….

核心要點
計算兩個數值之間的差值

#!/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