總結一下並記錄碰到的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
編寫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. [失敗]
#!/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
這個腳本的知識點是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
分析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
7.1 批量修改文件名bash
某個目錄下有以下幾個文件,要求將每一個文件的"_finished"去掉。
腳本示例:
#!/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
執行結果:
7.3 用for循環實現mysql數據庫分庫備份腳本
編寫shell腳本將mysql數據庫裏的三個庫harutya1,2,3備份出來,而且按照日期將備份文件進行壓縮。
不登陸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
執行結果:
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