批量ping脚本shell_30个Linux Shell脚本经典案例(上)
在學習Linux運維時,普遍反饋是:Linux Shell是一個很難的知識板塊。雖然大家都認真學,基本的語法也都掌握了,但有需求時,很難直接上手編程,要么寫了很久,要么寫不好!
也有很多做運維很多年的朋友也是如此,Shell腳本一直寫的不6!在網上看例子能照貓畫虎寫出來,完全獨立寫就困難了。對于初學者而言,因為沒有實戰經驗,寫不出來Shell腳本很正常,如果工作了幾年的運維老年還是寫不出來,那就是沒主動找需求,缺乏練習,缺乏經驗。
針對以上問題,總結了30個生產環境中經典的Shell腳本,通過這些需求案例,希望能幫助大家提升Shell編寫思路,掌握編寫技巧。
先了解下編寫Shell過程中注意事項:
開頭加解釋器:#!/bin/bash
語法縮進,使用四個空格;多加注釋說明。
命名建議規則:變量名大寫、局部變量小寫,函數名小寫,名字體現出實際作用。
默認變量是全局的,在函數中變量local指定為局部變量,避免污染其他作用域。
有兩個命令能幫助我調試腳本:set -e 遇到執行非0時退出腳本,set-x 打印執行過程。
寫腳本一定先測試再到生產上。
1、獲取隨機字符串或數字
獲取隨機8位字符串:
方法1:#?echo?$RANDOM?|md5sum?|cut?-c?1-8
471b94f2
方法2:#?openssl?rand?-base64?4
vg3BEg==
方法3:#?cat?/proc/sys/kernel/random/uuid?|cut?-c?1-8
ed9e032c
獲取隨機8位數字:
方法1:#?echo?$RANDOM?|cksum?|cut?-c?1-8
23648321
方法2:#?openssl?rand?-base64?4?|cksum?|cut?-c?1-8
38571131
方法3:#?date?+%N?|cut?-c?1-8
69024815
cksum:打印CRC效驗和統計字節
2、定義一個顏色輸出字符串函數
方法1:function?echo_color()?{if?[?$1?==?"green"?];?thenecho?-e?"\033[32;40m$2\033[0m"elif?[?$1?==?"red"?];?thenecho?-e?"\033[31;40m$2\033[0m"fi
}
方法2:function?echo_color()?{case?$1?in
????????green)echo?-e?"[32;40m$2[0m"
????????????;;
????????red)echo?-e?"[31;40m$2[0m"?
????????????;;
????????*)?echo?"Example:?echo_color?red?string"esac
}
使用方法:echo_color green "test"
function關鍵字定義一個函數,可加或不加。
3、批量創建用戶
#!/bin/bash
DATE=$(date?+%F_%T)
USER_FILE=user.txtecho_color(){if?[?$1?==?"green"?];?thenecho?-e?"[32;40m$2[0m"elif?[?$1?==?"red"?];?thenecho?-e?"[31;40m$2[0m"fi
}#?如果用戶文件存在并且大小大于0就備份if?[?-s?$USER_FILE?];?then
????mv?$USER_FILE?${USER_FILE}-${DATE}.bak
????echo_color?green?"$USER_FILE?exist,?rename?${USER_FILE}-${DATE}.bak"fiecho?-e?"User Password"?>>?$USER_FILEecho?"----------------"?>>?$USER_FILEfor?USER?in?user{1..10};?doif?!?id?$USER?&>/dev/null;?then
????????PASS=$(echo?$RANDOM?|md5sum?|cut?-c?1-8)
????????useradd?$USERecho?$PASS?|passwd?--stdin?$USER?&>/dev/nullecho?-e?"$USER $PASS"?>>?$USER_FILEecho?"$USER?User?create?successful."else
????????echo_color?red?"$USER?User?already?exists!"fidone
4、檢查軟件包是否安裝
#!/bin/bashif?rpm?-q?sysstat?&>/dev/null;?thenecho?"sysstat?is?already?installed."elseecho?"sysstat?is?not?installed!"fi
5、檢查服務狀態
#!/bin/bash
PORT_C=$(ss?-anu?|grep?-c?123)
PS_C=$(ps?-ef?|grep?ntpd?|grep?-vc?grep)if?[?$PORT_C?-eq?0?-o?$PS_C?-eq?0?];?thenecho?"內容"?|?mail?-s?"主題"?dst@example.comfi
6、檢查主機存活狀態
方法1:將錯誤IP放到數組里面判斷是否ping失敗三次
#!/bin/bash??
IP_LIST="192.168.18.1?192.168.1.1?192.168.18.2"for?IP?in?$IP_LIST;?do
????NUM=1while?[?$NUM?-le?3?];?doif?ping?-c?1?$IP?>?/dev/null;?thenecho?"$IP?Ping?is?successful."breakelse#?echo?"$IP?Ping?is?failure?$NUM"
????????????FAIL_COUNT[$NUM]=$IPlet?NUM++fidoneif?[?${#FAIL_COUNT[*]}?-eq?3?];thenecho?"${FAIL_COUNT[1]}?Ping?is?failure!"unset?FAIL_COUNT[*]fidone
? ?方法2:將錯誤次數放到FAIL_COUNT變量里面判斷是否ping失敗三次
#!/bin/bash??
IP_LIST="192.168.18.1?192.168.1.1?192.168.18.2"for?IP?in?$IP_LIST;?do
????FAIL_COUNT=0for?((i=1;i<=3;i++));?doif?ping?-c?1?$IP?>/dev/null;?thenecho?"$IP?Ping?is?successful."breakelse#?echo?"$IP?Ping?is?failure?$i"let?FAIL_COUNT++fidoneif?[?$FAIL_COUNT?-eq?3?];?thenecho?"$IP?Ping?is?failure!"fidone
方法3:利用for循環將ping通就跳出循環繼續,如果不跳出就會走到打印ping失敗
#!/bin/bashping_success_status()?{if?ping?-c?1?$IP?>/dev/null;?thenecho?"$IP?Ping?is?successful."continuefi
}
IP_LIST="192.168.18.1?192.168.1.1?192.168.18.2"for?IP?in?$IP_LIST;?do
????ping_success_status
????ping_success_status
????ping_success_statusecho?"$IP?Ping?is?failure!"done
7、監控CPU、內存和硬盤利用率
1)CPU
借助vmstat工具來分析CPU統計信息。
#!/bin/bash
DATE=$(date?+%F"?"%H:%M)
IP=$(ifconfig?eth0?|awk?-F? [?:]+ ? /inet?addr/{print?$4} )??#?只支持CentOS6
MAIL="example@mail.com"if?!?which?vmstat?&>/dev/null;?thenecho?"vmstat?command?no?found,?Please?install?procps?package."?exit?1fi
US=$(vmstat?|awk? NR==3{print?$13} )
SY=$(vmstat?|awk? NR==3{print?$14} )
IDLE=$(vmstat?|awk? NR==3{print?$15} )
WAIT=$(vmstat?|awk? NR==3{print?$16} )
USE=$(($US+$SY))if?[?$USE?-ge?50?];?thenecho?"
????Date:?$DATE
????Host:?$IP
????Problem:?CPU?utilization?$USE
????"?|?mail?-s?"CPU?Monitor"?$MAILfi
2)內存
#!/bin/bash
DATE=$(date?+%F"?"%H:%M)
IP=$(ifconfig?eth0?|awk?-F? [?:]+ ? /inet?addr/{print?$4} )??
MAIL="example@mail.com"
TOTAL=$(free?-m?|awk? /Mem/{print?$2} )
USE=$(free?-m?|awk? /Mem/{print?$3-$6-$7} )
FREE=$(($TOTAL-$USE))#?內存小于1G發送報警郵件if?[?$FREE?-lt?1024?];?thenecho?"
????Date:?$DATE
????Host:?$IP
????Problem:?Total=$TOTAL,Use=$USE,Free=$FREE
????"?|?mail?-s?"Memory?Monitor"?$MAILfi
3)硬盤
#!/bin/bash
DATE=$(date?+%F"?"%H:%M)
IP=$(ifconfig?eth0?|awk?-F? [?:]+ ? /inet?addr/{print?$4} )??
MAIL="example@mail.com"
TOTAL=$(fdisk?-l?|awk?-F [:?]+ ? BEGIN{OFS="="}/^Disk?/dev/{printf?"%s=%sG,",$2,$3} )
PART_USE=$(df?-h?|awk? BEGIN{OFS="="}/^/dev/{print?$1,int($5),$6} )for?i?in?$PART_USE;?do
????PART=$(echo?$i?|cut?-d"="?-f1)
????USE=$(echo?$i?|cut?-d"="?-f2)
????MOUNT=$(echo?$i?|cut?-d"="?-f3)if?[?$USE?-gt?80?];?thenecho?"
????????Date:?$DATE
????????Host:?$IP
????????Total:?$TOTAL
????????Problem:?$PART=$USE($MOUNT)
????????"?|?mail?-s?"Disk?Monitor"?$MAILfidone
8、批量主機磁盤利用率監控
前提監控端和被監控端SSH免交互登錄或者密鑰登錄。
寫一個配置文件保存被監控主機SSH連接信息,文件內容格式:IP User Port
#!/bin/bash
HOST_INFO=host.infofor?IP?in?$(awk? /^[^#]/{print?$1} ?$HOST_INFO);?do
????USER=$(awk?-v?ip=$IP? ip==$1{print?$2} ?$HOST_INFO)
????PORT=$(awk?-v?ip=$IP? ip==$1{print?$3} ?$HOST_INFO)
????TMP_FILE=/tmp/disk.tmp
????ssh?-p?$PORT?$USER@$IP? df?-h ?>?$TMP_FILE
????USE_RATE_LIST=$(awk? BEGIN{OFS="="}/^/dev/{print?$1,int($5)} ?$TMP_FILE)for?USE_RATE?in?$USE_RATE_LIST;?do
????????PART_NAME=${USE_RATE%=*}
????????USE_RATE=${USE_RATE#*=}if?[?$USE_RATE?-ge?80?];?thenecho?"Warning:?$PART_NAME?Partition?usage?$USE_RATE%!"fidonedone
9、檢查網站可用性
1)檢查URL可用性
方法1:check_url()?{
????HTTP_CODE=$(curl?-o?/dev/null?--connect-timeout?3?-s?-w?"%{http_code}"?$1)if?[?$HTTP_CODE?-ne?200?];?thenecho?"Warning:?$1?Access?failure!"fi
}
方法2:check_url()?{if?!?wget?-T?10?--tries=1?--spider?$1?>/dev/null?2>&1;?then??#-T超時時間,--tries嘗試1次,--spider爬蟲模式echo?"Warning:?$1?Access?failure!"fi
}
使用方法:check_url www.baidu.com
2)判斷三次URL可用性
思路與上面檢查主機存活狀態一樣。
方法1:利用循環技巧,如果成功就跳出當前循環,否則執行到最后一行
#!/bin/bash??check_url()?{
????HTTP_CODE=$(curl?-o?/dev/null?--connect-timeout?3?-s?-w?"%{http_code}"?$1)if?[?$HTTP_CODE?-eq?200?];?thencontinuefi
}
URL_LIST="www.baidu.com?www.agasgf.com"for?URL?in?$URL_LIST;?do
????check_url?$URL
????check_url?$URL
????check_url?$URLecho?"Warning:?$URL?Access?failure!"done
? ?方法2:錯誤次數保存到變量
#!/bin/bash??
URL_LIST="www.baidu.com?www.agasgf.com"for?URL?in?$URL_LIST;?do
????FAIL_COUNT=0for?((i=1;i<=3;i++));?do
????????HTTP_CODE=$(curl?-o?/dev/null?--connect-timeout?3?-s?-w?"%{http_code}"?$URL)if?[?$HTTP_CODE?-ne?200?];?thenlet?FAIL_COUNT++elsebreakfidoneif?[?$FAIL_COUNT?-eq?3?];?thenecho?"Warning:?$URL?Access?failure!"fidone
? ?方法3:錯誤次數保存到數組
#!/bin/bash??
URL_LIST="www.baidu.com?www.agasgf.com"for?URL?in?$URL_LIST;?do
????NUM=1while?[?$NUM?-le?3?];?do
????????HTTP_CODE=$(curl?-o?/dev/null?--connect-timeout?3?-s?-w?"%{http_code}"?$URL)if?[?$HTTP_CODE?-ne?200?];?then
????????????FAIL_COUNT[$NUM]=$IP??#創建數組,以$NUM下標,$IP元素let?NUM++elsebreakfidoneif?[?${#FAIL_COUNT[*]}?-eq?3?];?thenecho?"Warning:?$URL?Access?failure!"unset?FAIL_COUNT[*]????#清空數組fidone
10、檢查MySQL主從同步狀態
#!/bin/bash??
USER=bak
PASSWD=123456
IO_SQL_STATUS=$(mysql?-u$USER?-p$PASSWD?-e? show?slave?statusG ?|awk?-F:? /Slave_.*_Running/{gsub(":?",":");print?$0} )??#gsub去除冒號后面的空格for?i?in?$IO_SQL_STATUS;?do
????THREAD_STATUS_NAME=${i%:*}
????THREAD_STATUS=${i#*:}if?[?"$THREAD_STATUS"?!=?"Yes"?];?thenecho?"Error:?MySQL?Master-Slave?$THREAD_STATUS_NAME?status?is?$THREAD_STATUS!"fidone
動手練一練,讓你的Shell功底上升一個段位!
未完待續...
推薦閱讀:
編寫Linux Shell腳本的最佳實踐
K8S 到底要不要掌握?
年輕時偷的懶,遲早是要還的。點亮
總結
以上是生活随笔為你收集整理的批量ping脚本shell_30个Linux Shell脚本经典案例(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么让饼状图里面显示百分比_教你用mat
- 下一篇: 获取昨天凌晨毫秒数_Java 获取当前时