Linux運維:shell腳本(3)

總結一下並記錄碰到的shell腳本,持續更新.......

系列筆記傳送門:mysql

一、統計進程佔用內存大小

寫一個腳本計算一下linux系統全部進程佔用內存大小的和。linux

#!/bin/bash
sum=0
for mem in `ps aux | awk '{print $6}' | grep -v 'RSS'`
do
    sum=$[$sum + $mem]
done
echo "The total memory is $sum"

二、批量建立用戶

寫一個腳本實現:
添加user_00-user-09總共10個用戶,而且對這10個用戶設置一個隨機密碼,密碼要求10位包含大小寫字母以及數字,最後將每一個用戶的密碼記錄到一個日誌文件裏。nginx

#!/bin/bash
for i in `seq -w 0 09`
do
    useradd user_$i
    p=`mkpasswd -s 0 -l 10`
    echo "user_$i $p" >> /tmp/user0_9.pass
    echo $p |passwd --stdin user_$i
done

三、URL檢測腳本

編寫shell腳本檢測URL是否正常。web

#!/bin/bash
. /etc/init.d/functions

function usage(){
    echo $"usage:$0 url"
    exit 1
}

function check_url(){
    wget --spider -q -o /dev/null --tries=1 -T 5 $1
    if [ $? -eq 0 ];then
        action "$1 is yes." /bin/true
    else
        action "$1 is no." /bin/false
    fi
}

function main(){
    if [ $# -ne 1 ];then
        usage
    fi
    check_url $1
}
main $*

測試結果:sql

[root@moli_linux1 script]# sh check_url.sh www.baidu.com
www.baidu.com is yes.                                      [  肯定  ]
[root@moli_linux1 script]# sh check_url.sh www.baiduxxx.com
www.baiduxxx.com is no.                                    [失敗]

四、結合while循環,每隔10s檢查多個網站是否正常

#!/bin/bash
. /etc/init.d/functions
check_count=0
url_list=(            # 定義URL數組,能夠寫多個URL
https://www.baidu.com
https://www.qq.com
https://segmentfault.com
)

function wait(){        # 定義倒計時函數
    echo -n '3秒後,執行檢查URL操做.'
    for ((i=0;i<3;i++))
    do
        echo -n ".";sleep 1 
    done
    echo 
}
function check_url(){  # 定義檢測函數
    wait
    for ((i=0;i<`echo ${#url_list[*]}`;i++))
    do
        # wget這條命令檢測數組裏面的URL地址可否被正常訪問,正常訪問返回0,訪問失敗返回非0數字
        wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} > /dev/null 2>&1
     if [ $? -eq 0 ];then    # $?返回值爲0表示網址正常
            action "${url_list[$i]}" /bin/true
        else 
            action "${url_list[$i]}" /bin/false
        fi
    done
    ((check_count++))
}
function main(){
    while true
    do
     check_url
    echo "---------check count:${check_count}---------"
    sleep 10 # 設置每隔10s檢測一次
    done
}
main

執行結果:shell

clipboard.png

五、開發一個shell腳本,實現cat命令的功能

這個腳本的知識點是while循環讀取文件文件操做,while循環按行讀取文件的方法有多種,下面是其中一種。數據庫

[root@moli_linux1 script]$ cat 10_6.sh 
#!/bin/bash
while read line
do
    echo $line
done<$1

效果以下:segmentfault

[root@moli_linux1 script]$ sh 10_6.sh /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.30.2 ccc.com ddd.com

六、shell腳本解決DDoS攻擊

分析web日誌,能夠每小時或者每分鐘分析一次,例如將日誌按小時進行分割,分紅多個不一樣文件,而後分析這些文件,把單個文件中單個IP訪問量超大的IP封掉。下例以nginx訪問日誌爲例:數組

#!/bin/bash
path="/usr/local/nginx/logs/access.log" # Web日誌文件
tmp_log_path="/tmp/nginx_tmp.log" # awk分析後的IP日誌文件
while true
do
    # 把IP和IP對應的訪問次數記錄到新日誌文件
    awk '{print $1}' ${path} | grep -v "^$"| sort | uniq -c >${tmp_log_path}
    exec < ${tmp_log_path}
    # 讀取日誌文件
    while read line
    do
        ip=`echo $line | awk '{print $2}'`
        count=`echo $line | awk '{print $1}'`
        # 若是IP的訪問次數大於500並且iptables規則沒有這個IP的規則,那麼就封掉
        if [ $count -gt 500 ] && [ `iptables -n -L | grep ${ip}|wc -l` -lt 1 ];then
            iptables -I INPUT -s $ip -j DROP
            echo "iptables is open make $line is block." >> block_ip.log
        fi
    done
    sleep 3600 # 睡眠1小時
done

七、for循環的簡單應用

7.1 批量修改文件名bash

某個目錄下有以下幾個文件,要求將每一個文件的"_finished"去掉。
clipboard.png

腳本示例:

#!/bin/bash
path=/root/server/script/test
cd ${path}
for file in `ls *.jpg` # for遍歷整個目錄下全部以.jpg結尾的文件
do
    mv $file `echo $file|sed 's/_finished//g'`  # 這裏使用sed命令將_finished字符串所有替換爲空
done

執行結果:

[root@moli_linux1 script]# sh 11_4.sh
[root@moli_linux1 script]# ll test
總用量 0
-rw-r--r-- 1 root root 0 7月   7 12:54 stu_10299_1.jpg
-rw-r--r-- 1 root root 0 7月   7 12:55 stu_10299_2.jpg
-rw-r--r-- 1 root root 0 7月   7 12:55 stu_10299_3.jpg
-rw-r--r-- 1 root root 0 7月   7 12:55 stu_10299_4.jpg
-rw-r--r-- 1 root root 0 7月   7 12:55 stu_10299_5.jpg

7.2 打印九九乘法表

#!/bin/bash
COLOR='\E[47;30m'
RES='\E[0m'
for n1 in `seq 9`
do
    for n2 in `seq 9`
    do
        if [ $n1 -ge $n2 ];then
            if ((n1*n2>9));then
                echo -en "${COLOR}${n1}x${n2}=$((n1*n2))${RES} "
            else
                echo -en "${COLOR}${n1}x${n2}=$((n1*n2))${RES} "
            fi
        fi
    done
echo "  "
done

執行結果:

clipboard.png

7.3 用for循環實現mysql數據庫分庫備份腳本
編寫shell腳本將mysql數據庫裏的三個庫harutya1,2,3備份出來,而且按照日期將備份文件進行壓縮。

clipboard.png

不登陸mysql進行單庫備份的命令是:

mysqldump -uroot -p123456 -S /tmp/mysql.sock hatutya1| gzip>/root/server/script/test/harutya1_$(date +%F).sql.gz

腳本實現:

#!/bin/bash
DBPATH="/root/server/backup" 
BACKUP_USER="root"
BACKUP_PASSWD="123456"
SOCKET="/tmp/mysql.sock"
MYCMD="mysql -u${BACKUP_USER} -p${BACKUP_PASSWD} -S ${SOCKET}"
MYDUMP="mysqldump -u${BACKUP_USER} -p${BACKUP_PASSWD} -S ${SOCKET}"
[ ! -d "${DBPATH}" ] && mkdir -p ${DBPATH}
for dbname in `$MYCMD -e "show databases;" 2>/dev/null|sed '1,2d'|grep "harutya"`
do
    $MYDUMP $dbname 2>/dev/null |gzip>$DBPATH/"$dbname"_$(date +%F).sql.gz
done

執行結果:

clipboard.png

八、Linux產生隨機數的幾種方法

8.1 經過系統變量$RANDOM

$RANDOM的隨機數範圍是0-32767,加密性不是很好,能夠經過輸出隨機數後增長加密字符串的方式解決,最後結合md5sum操做並截取結果的後n位,這樣就能夠生成較複雜的隨機數了,可用做用戶密碼等。

[root@moli_linux1 script]# echo $RANDOM # 輸出簡單的數字
21572
[root@moli_linux1 script]# echo $RANDOM
19201
[root@moli_linux1 script]# echo "harutya$RANDOM"|md5sum |cut -c 8-15 # 與md5sum結合再使用cutM命令進行截取
d2c2f1d9

8.2 經過opensll產生隨機數

[root@moli_linux1 script]# openssl rand -base64 8
6tFdSQqMwrc=
[root@moli_linux1 script]# openssl rand -base64 80
88ASydNvD8KQxM8N2TnSTCZR7fXVZETPL1BGOAUMv7ZbTS6hxnIGJZdJ0FoCj2Gn
WSMQkSn3JdMrgz2o8oH78QaNh2kpBo0ht7CSN7If+EY=

8.3 經過date命令

[root@moli_linux1 script]# date +%s%N
1562481571763444791
[root@moli_linux1 script]# date +%s%N
1562481573090353690
[root@moli_linux1 script]# date +%s%N
1562481575834864133

8.4 mkpasswd命令

選項:

  • -l(是L不是1):指定密碼的長度,後面數字9表示生成的密碼有9位,默認7位;
  • -d:指定密碼中數字最少是幾位,默認2位;
  • -c:指定密碼中小寫字母最少是幾位,默認2位;
  • -C:指定密碼中大寫字母最少是幾位,默認2位;
  • -s:指定密碼中特殊字符最少位數,默認是1位

示例,生成9位長的密碼,數字最少有2位,小寫字母和大寫字母都至少有3個,特殊符號至少1個:

[root@moli_linux1 script]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1 
r9kELr~F3
[root@moli_linux1 script]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1
euvS2J\7L
[root@moli_linux1 script]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1
~id0RG3Aq
相關文章
相關標籤/搜索