一、寫一個腳本,輸入數字後執行對應命令: 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 .............
首先尋找規律; 尋找差值,假設第一行差值定義成 x 第二行差值定義成 y 第三行差值定義成 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 ; 可知 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