绝了,这18 个开箱即用的 Shell 脚本值得收藏
?
[歡迎關(guān)注微信公眾號(hào):廈門(mén)微思網(wǎng)絡(luò)]
1、檢測(cè)兩臺(tái)服務(wù)器指定目錄下的文件一致性
#!/bin/bash ###################################### 檢測(cè)兩臺(tái)服務(wù)器指定目錄下的文件一致性 ##################################### #通過(guò)對(duì)比兩臺(tái)服務(wù)器上文件的md5值,達(dá)到檢測(cè)一致性的目的 dir=/data/web b_ip=192.168.88.10 #將指定目錄下的文件全部遍歷出來(lái)并作為md5sum命令的參數(shù),進(jìn)而得到所有文件的md5值,并寫(xiě)入到指定文件中 find?$dir?-type?f|xargs?md5sum?>?/tmp/md5_a.txt ssh?$b_ip?"find?$dir?-type?f|xargs?md5sum?>?/tmp/md5_b.txt" scp?$b_ip:/tmp/md5_b.txt?/tmp #將文件名作為遍歷對(duì)象進(jìn)行一一比對(duì) for?f?in?`awk?'{print?2}?/tmp/md5_a.txt'`do #以a機(jī)器為標(biāo)準(zhǔn),當(dāng)b機(jī)器不存在遍歷對(duì)象中的文件時(shí)直接輸出不存在的結(jié)果 if?grep?-qw?"$f"?/tmp/md5_b.txt then md5_a=`grep?-w?"$f"?/tmp/md5_a.txt|awk?'{print?1}'` md5_b=`grep?-w?"$f"?/tmp/md5_b.txt|awk?'{print?1}'` #當(dāng)文件存在時(shí),如果md5值不一致則輸出文件改變的結(jié)果 if?[?$md5_a?!=?$md5_b?]then echo?"$f?changed." fi else echo?"$f?deleted." fi done2、定時(shí)清空文件內(nèi)容,定時(shí)記錄文件大小
#!/bin/bash ################################################################# 每小時(shí)執(zhí)行一次腳本(任務(wù)計(jì)劃),當(dāng)時(shí)間為0點(diǎn)或12點(diǎn)時(shí),將目標(biāo)目錄下的所有文件內(nèi)#容清空,但不刪除文件,其他時(shí)間則只統(tǒng)計(jì)各個(gè)文件的大小,一個(gè)文件一行,輸出到以時(shí)#間和日期命名的文件中,需要考慮目標(biāo)目錄下二級(jí)、三級(jí)等子目錄的文件 ################################################################ logfile=/tmp/`date?+%H-%F`.log n=`date?+%H` if?[?$n?-eq?00?]?||?[?$n?-eq?12?] then #通過(guò)for循環(huán),以find命令作為遍歷條件,將目標(biāo)目錄下的所有文件進(jìn)行遍歷并做相應(yīng)操作 for?i?in?`find?/data/log/?-type?f` do true?>?$i done else for?i?in?`find?/data/log/?-type?f` do du?-sh?$i?>>?$logfile done fi3、檢測(cè)網(wǎng)卡流量,并按規(guī)定格式記錄在日志中
#!/bin/bash ####################################################### #檢測(cè)網(wǎng)卡流量,并按規(guī)定格式記錄在日志中#規(guī)定一分鐘記錄一次 #日志格式如下所示: #2019-08-12?20:40 #ens33?input:?1234bps #ens33?output:?1235bps ######################################################3 while?: do #設(shè)置語(yǔ)言為英文,保障輸出結(jié)果是英文,否則會(huì)出現(xiàn)bug LANG=en logfile=/tmp/`date?+%d`.log #將下面執(zhí)行的命令結(jié)果輸出重定向到logfile日志中 exec?>>?$logfile date?+"%F?%H:%M" #sar命令統(tǒng)計(jì)的流量單位為kb/s,日志格式為bps,因此要*1000*8 sar?-n?DEV?1?59|grep?Average|grep?ens33|awk?'{print?$2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}' echo?"####################" #因?yàn)閳?zhí)行sar命令需要59秒,因此不需要sleep done4、計(jì)算文檔每行出現(xiàn)的數(shù)字個(gè)數(shù),并計(jì)算整個(gè)文檔的數(shù)字總數(shù)
#!/bin/bash ######################################################### #計(jì)算文檔每行出現(xiàn)的數(shù)字個(gè)數(shù),并計(jì)算整個(gè)文檔的數(shù)字總數(shù) ######################################################## #使用awk只輸出文檔行數(shù)(截取第一段) n=`wc?-l?a.txt|awk?'{print?$1}'` sum=0 #文檔中每一行可能存在空格,因此不能直接用文檔內(nèi)容進(jìn)行遍歷 for?i?in?`seq?1?$n`do #輸出的行用變量表示時(shí),需要用雙引號(hào) line=`sed?-n?"$i"p?a.txt`#wc?-L選項(xiàng),統(tǒng)計(jì)最長(zhǎng)行的長(zhǎng)度 n_n=`echo?$line|sed?s'/[^0-9]//'g|wc?-L` echo?$n_nsum=$[$sum+$n_n] done echo?"sum:$sum"殺死所有腳本
#!/bin/bash ################################################################ #有一些腳本加入到了cron之中,存在腳本尚未運(yùn)行完畢又有新任務(wù)需要執(zhí)行的情況, #導(dǎo)致系統(tǒng)負(fù)載升高,因此可通過(guò)編寫(xiě)腳本,篩選出影響負(fù)載的進(jìn)程一次性全部殺死。 ################################################################ ps?aux|grep?指定進(jìn)程名|grep?-v?grep|awk?'{print?$2}'|xargs?kill?-95、從 FTP 服務(wù)器下載文件
#!/bin/bash if?[?$#?-ne?1?];?thenecho?"Usage:?$0?filename" fi dir=$(dirname?$1) file=$(basename?$1) ftp?-n?-v?<<?EOF???#?-n?自動(dòng)登錄 open?192.168.1.10??#?ftp服務(wù)器 user?admin?password binary???#?設(shè)置ftp傳輸模式為二進(jìn)制,避免MD5值不同或.tar.gz壓縮包格式錯(cuò)誤 cd?$dir get?"$file" EOF6、連續(xù)輸入5個(gè)100以內(nèi)的數(shù)字,統(tǒng)計(jì)和、最小和最大
#!/bin/bash COUNT=1 SUM=0 MIN=0 MAX=100 while?[?$COUNT?-le?5?];?doread?-p?"請(qǐng)輸入1-10個(gè)整數(shù):"?INT????if?[[?!?$INT?=~?^[0-9]+$?]];?thenecho?"輸入必須是整數(shù)!"exit?1elif?[[?$INT?-gt?100?]];?thenecho?"輸入必須是100以內(nèi)!"exit?1fiSUM=$(($SUM+$INT))[?$MIN?-lt?$INT?]?&&?MIN=$INT[?$MAX?-gt?$INT?]?&&?MAX=$INTlet?COUNT++done echo?"SUM:?$SUM" echo?"MIN:?$MIN" echo?"MAX:?$MAX用戶猜數(shù)字
#!/bin/bash??#?腳本生成一個(gè)?100?以內(nèi)的隨機(jī)數(shù),提示用戶猜數(shù)字,根據(jù)用戶的輸入,提示用戶猜對(duì)了, #?猜小了或猜大了,直至用戶猜對(duì)腳本結(jié)束。 #?RANDOM?為系統(tǒng)自帶的系統(tǒng)變量,值為?0‐32767的隨機(jī)數(shù) #?使用取余算法將隨機(jī)數(shù)變?yōu)?1‐100?的隨機(jī)數(shù)num=$[RANDOM%100+1]echo?"$num"? #?使用?read?提示用戶猜數(shù)字 #?使用?if?判斷用戶猜數(shù)字的大小關(guān)系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于), #?‐lt(小于),‐le(小于等于)while?:do?????read?-p?"計(jì)算機(jī)生成了一個(gè)?1‐100?的隨機(jī)數(shù),你猜:?"?cai????if?[?$cai?-eq?$num?]????then????????echo?"恭喜,猜對(duì)了"???????????exit????????elif?[?$cai?-gt?$num?]???????then????????????echo?"Oops,猜大了"?????????else????????????echo?"Oops,猜小了"?????fidone7、監(jiān)測(cè) Nginx 訪問(wèn)日志 502 情況,并做相應(yīng)動(dòng)作
假設(shè)服務(wù)器環(huán)境為 lnmp,近期訪問(wèn)經(jīng)常出現(xiàn) 502 現(xiàn)象,且 502 錯(cuò)誤在重啟 php-fpm 服務(wù)后消失,因此需要編寫(xiě)監(jiān)控腳本,一旦出現(xiàn) 502,則自動(dòng)重啟 php-fpm 服務(wù)。
#場(chǎng)景: #1.訪問(wèn)日志文件的路徑:/data/log/access.log #2.腳本死循環(huán),每10秒檢測(cè)一次,10秒的日志條數(shù)為300條,出現(xiàn)502的比例不低于10%(30條)則需要重啟php-fpm服務(wù) #3.重啟命令為:/etc/init.d/php-fpm restart #!/bin/bash ########################################################### #監(jiān)測(cè)Nginx訪問(wèn)日志502情況,并做相應(yīng)動(dòng)作 ########################################################### log=/data/log/access.log N=30?#設(shè)定閾值 while?:do#查看訪問(wèn)日志的最新300條,并統(tǒng)計(jì)502的次數(shù)err=`tail?-n?300?$log?|grep?-c?'502"?'`? if?[?$err?-ge?$N?]? then /etc/init.d/php-fpm?restart?2>?/dev/null? #設(shè)定60s延遲防止腳本bug導(dǎo)致無(wú)限重啟php-fpm服務(wù)sleep?60fisleep?10done8、將結(jié)果分別賦值給變量
應(yīng)用場(chǎng)景:希望將執(zhí)行結(jié)果或者位置參數(shù)賦值給變量,以便后續(xù)使用。
方法1:
for?i?in?$(echo?"4?5?6");?doeval?a$i=$idone echo?$a4?$a5?$a6方法2:將位置參數(shù)192.168.1.1{1,2}拆分為到每個(gè)變量
num=0 for?i?in?$(eval?echo?$*);do???#eval將{1,2}分解為1?2let?num+=1eval?node${num}="$i" done echo?$node1?$node2?$node3 #?bash?a.sh?192.168.1.1{1,2} 192.168.1.11?192.168.1.12方法3:arr=(4 5 6) INDEX1=$(echo?${arr[0]}) INDEX2=$(echo?${arr[1]}) INDEX3=$(echo?${arr[2]})9、批量修改文件名
示例:
#?touch?article_{1..3}.html #?lsarticle_1.html??article_2.html??article_3.html 目的:把a(bǔ)rticle改為bbs方法1:
for?file?in?$(ls?*html);?domv?$file?bbs_${file#*_}#?mv?$file?$(echo?$file?|sed?-r?'s/.*(_.*)/bbs\1/')#?mv?$file?$(echo?$file?|echo?bbs_$(cut?-d_?-f2)方法2:
for?file?in?$(find?.?-maxdepth?1?-name?"*html");?domv?$file?bbs_${file#*_}done方法3:
#?rename?article?bbs?*.html 把一個(gè)文檔前五行中包含字母的行刪掉,同時(shí)刪除6到10行包含的所有字母1)準(zhǔn)備測(cè)試文件,文件名為2.txt第1行1234567不包含字母 第2行56789BBBBBB 第3行67890CCCCCCCC 第4行78asdfDDDDDDDDD 第5行123456EEEEEEEE 第6行1234567ASDF 第7行56789ASDF 第8行67890ASDF 第9行78asdfADSF 第10行123456AAAA 第11行67890ASDF 第12行78asdfADSF 第13行123456AAAA2)腳本如下:
#!/bin/bash ############################################################### 把一個(gè)文檔前五行中包含字母的行刪掉,同時(shí)刪除6到10行包含的所有字母 ############################################################## sed?-n?'1,5'p?2.txt?|sed?'/[a-zA-Z]/'d sed?-n?'6,10'p?2.txt?|sed?s'/[a-zA-Z]//'g sed?-n?'11,$'p?2.txt #最終結(jié)果只是在屏幕上打印結(jié)果,如果想直接更改文件,可將輸出結(jié)果寫(xiě)入臨時(shí)文件中,再替換2.txt或者使用-i選項(xiàng)10、統(tǒng)計(jì)當(dāng)前目錄中以.html結(jié)尾的文件總大
方法1:
#?find?.?-name?"*.html"?-exec?du?-k?{}?\;?|awk?'{sum+=$1}END{print?sum}'方法2: ```bash for?size?in?$(ls?-l?*.html?|awk?'{print?$5}');?dosum=$(($sum+$size)) done echo?$sum11、掃描主機(jī)端口狀態(tài)
#!/bin/bash HOST=$1 PORT="22?25?80?8080" for?PORT?in?$PORT;?doif?echo?&>/dev/null?>?/dev/tcp/$HOST/$PORT;?thenecho?"$PORT?open"elseecho?"$PORT?close"fi done 用?shell?打印示例語(yǔ)句中字母數(shù)小于6的單詞#示例語(yǔ)句: #Bash?also?interprets?a?number?of?multi-character?options. #!/bin/bash ############################################################## #shell打印示例語(yǔ)句中字母數(shù)小于6的單詞 ############################################################## for?s?in?Bash?also?interprets?a?number?of?multi-character?options. don=`echo?$s|wc?-c`?if?[?$n?-lt?6?]?thenecho?$sfi done12、輸入數(shù)字運(yùn)行相應(yīng)命令
#!/bin/bash ############################################################## #輸入數(shù)字運(yùn)行相應(yīng)命令 ############################################################## echo?"*cmd?menu*?1-date?2-ls?3-who?4-pwd?0-exit?" while?: do #捕獲用戶鍵入值read?-p?"please?input?number?:"?nn1=`echo?$n|sed?s'/[0-9]//'g` #空輸入檢測(cè)?if?[?-z?"$n"?]thencontinuefi #非數(shù)字輸入檢測(cè)?if?[?-n?"$n1"?]thenexit?0fibreak done case?$n?in1)date;;2)ls;;3)who;;4)pwd;;0)break;;#輸入數(shù)字非1-4的提示*)echo?"please?input?number?is?[1-4]" esac13、Expect 實(shí)現(xiàn) SSH 免交互執(zhí)行命令
Expect是一個(gè)自動(dòng)交互式應(yīng)用程序的工具,如telnet,ftp,passwd等。
需先安裝expect軟件包。
方法1:EOF標(biāo)準(zhǔn)輸出作為expect標(biāo)準(zhǔn)輸入
#!/bin/bash USER=root PASS=123.com IP=192.168.1.120 expect?<<?EOFset?timeout?30spawn?ssh?$USER@$IP???expect?{????"(yes/no)"?{send?"yes\r";?exp_continue}????"password:"?{send?"$PASS\r"} } expect?"$USER@*"??{send?"$1\r"} expect?"$USER@*"??{send?"exit\r"} expect?eof EOF方法2:
#!/bin/bash USER=root PASS=123.com IP=192.168.1.120 expect?-c?"spawn?ssh?$USER@$IPexpect?{\"(yes/no)\"?{send?\"yes\r\";?exp_continue}\"password:\"?{send?\"$PASS\r\";?exp_continue}\"$USER@*\"?{send?\"df?-h\r?exit\r\";?exp_continue}}"方法3:將expect腳本獨(dú)立出來(lái)
登錄腳本: #?cat?login.exp #!/usr/bin/expect set?ip?[lindex?$argv?0] set?user?[lindex?$argv?1] set?passwd?[lindex?$argv?2] set?cmd?[lindex?$argv?3] if?{?$argc?!=?4?}?{ puts?"Usage:?expect?login.exp?ip?user?passwd" exit?1 } set?timeout?30 spawn?ssh?$user@$ip expect?{????"(yes/no)"?{send?"yes\r";?exp_continue}"password:"?{send?"$passwd\r"} } expect?"$user@*"??{send?"$cmd\r"} expect?"$user@*"??{send?"exit\r"} expect?eof執(zhí)行命令腳本:寫(xiě)個(gè)循環(huán)可以批量操作多臺(tái)服務(wù)器
#!/bin/bash HOST_INFO=user_info.txt for?ip?in?$(awk?'{print?$1}'?$HOST_INFO) douser=$(awk?-v?I="$ip"?'I==$1{print?$2}'?$HOST_INFO)pass=$(awk?-v?I="$ip"?'I==$1{print?$3}'?$HOST_INFO)expect?login.exp?$ip?$user?$pass?$1 done Linux主機(jī)SSH連接信息: #?cat?user_info.txt 192.168.1.120?root?123456 創(chuàng)建10個(gè)用戶,并分別設(shè)置密碼,密碼要求10位且包含大小寫(xiě)字母以及數(shù)字,最后需要把每個(gè)用戶的密碼存在指定文件中 ```bash #!/bin/bash ############################################################## #創(chuàng)建10個(gè)用戶,并分別設(shè)置密碼,密碼要求10位且包含大小寫(xiě)字母以及數(shù)字 #最后需要把每個(gè)用戶的密碼存在指定文件中#前提條件:安裝mkpasswd命令 ############################################################## #生成10個(gè)用戶的序列(00-09) for?u?in?`seq?-w?0?09`do#創(chuàng)建用戶useradd?user_$u#生成密碼p=`mkpasswd?-s?0?-l?10`?#從標(biāo)準(zhǔn)輸入中讀取密碼進(jìn)行修改(不安全)echo?$p|passwd?--stdin?user_$u#常規(guī)修改密碼echo?-e?"$p\n$p"|passwd?user_$u#將創(chuàng)建的用戶及對(duì)應(yīng)的密碼記錄到日志文件中echo?"user_$u?$p"?>>?/tmp/userpassworddone14、監(jiān)控 httpd 的進(jìn)程數(shù),根據(jù)監(jiān)控情況做相應(yīng)處理
#!/bin/bash ############################################################################################################################### #需求: #1.每隔10s監(jiān)控httpd的進(jìn)程數(shù),若進(jìn)程數(shù)大于等于500,則自動(dòng)重啟Apache服務(wù),并檢測(cè)服務(wù)是否重啟成功 #2.若未成功則需要再次啟動(dòng),若重啟5次依舊沒(méi)有成功,則向管理員發(fā)送告警郵件,并退出檢測(cè) #3.如果啟動(dòng)成功,則等待1分鐘后再次檢測(cè)httpd進(jìn)程數(shù),若進(jìn)程數(shù)正常,則恢復(fù)正常檢測(cè)(10s一次),否則放棄重啟并向管理員發(fā)送告警郵件,并退出檢測(cè) ############################################################################################################################### #計(jì)數(shù)器函數(shù) check_service() {j=0for?i?in?`seq?1?5`?do#重啟Apache的命令/usr/local/apache2/bin/apachectl?restart?2>?/var/log/httpderr.log????#判斷服務(wù)是否重啟成功if?[?$??-eq?0?]?thenbreakelsej=$[$j+1]?fi#判斷服務(wù)是否已嘗試重啟5次if?[?$j?-eq?5?]?thenmail.py?exitfidone?}while?:don=`pgrep?-l?httpd|wc?-l`?#判斷httpd服務(wù)進(jìn)程數(shù)是否超過(guò)500if?[?$n?-gt?500?]?then/usr/local/apache2/bin/apachectl?restart?if?[?$??-ne?0?]?thencheck_service?elsesleep?60n2=`pgrep?-l?httpd|wc?-l`?#判斷重啟后是否依舊超過(guò)500if?[?$n2?-gt?500?]?then?mail.py?exitfififi#每隔10s檢測(cè)一次sleep?10done15、批量修改服務(wù)器用戶密碼
Linux主機(jī)SSH連接信息:舊密碼
#?cat?old_pass.txt? 192.168.18.217??root????123456?????22 192.168.18.218??root????123456?????22 內(nèi)容格式:IP User Password PortSSH遠(yuǎn)程修改密碼腳本:新密碼隨機(jī)生成 https://www.linuxprobe.com/books #!/bin/bash OLD_INFO=old_pass.txt NEW_INFO=new_pass.txt for?IP?in?$(awk?'/^[^#]/{print?$1}'?$OLD_INFO);?doUSER=$(awk?-v?I=$IP?'I==$1{print?$2}'?$OLD_INFO)PASS=$(awk?-v?I=$IP?'I==$1{print?$3}'?$OLD_INFO)PORT=$(awk?-v?I=$IP?'I==$1{print?$4}'?$OLD_INFO)NEW_PASS=$(mkpasswd?-l?8)??#?隨機(jī)密碼echo?"$IP???$USER???$NEW_PASS???$PORT"?>>?$NEW_INFOexpect?-c?"spawn?ssh?-p$PORT?$USER@$IPset?timeout?2expect?{\"(yes/no)\"?{send?\"yes\r\";exp_continue}\"password:\"?{send?\"$PASS\r\";exp_continue}\"$USER@*\"?{send?\"echo?\'$NEW_PASS\'?|passwd?--stdin?$USER\r?exit\r\";exp_continue}}" done 生成新密碼文件:#?cat?new_pass.txt? 192.168.18.217??root????n8wX3mU%??????22 192.168.18.218??root????c87;ZnnL??????2216、iptables 自動(dòng)屏蔽訪問(wèn)網(wǎng)站頻繁的IP
場(chǎng)景:惡意訪問(wèn),安全防范
1)屏蔽每分鐘訪問(wèn)超過(guò)200的IP
方法1:根據(jù)訪問(wèn)日志(Nginx為例)
#!/bin/bash DATE=$(date?+%d/%b/%Y:%H:%M) ABNORMAL_IP=$(tail?-n5000?access.log?|grep?$DATE?|awk?'{a[$1]++}END{for(i?in?a)if(a[i]>100)print?i}') #先tail防止文件過(guò)大,讀取慢,數(shù)字可調(diào)整每分鐘最大的訪問(wèn)量。awk不能直接過(guò)濾日志,因?yàn)榘厥庾址?for?IP?in?$ABNORMAL_IP;?doif?[?$(iptables?-vnL?|grep?-c?"$IP")?-eq?0?];?theniptables?-I?INPUT?-s?$IP?-j?DROP????fidone方法2:通過(guò)TCP建立的連接
#!/bin/bash ABNORMAL_IP=$(netstat?-an?|awk?'$4~/:80$/?&&?$6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(i?in?a)if(a[i]>100)print?i}') #gsub是將第五列(客戶端IP)的冒號(hào)和端口去掉 for?IP?in?$ABNORMAL_IP;?doif?[?$(iptables?-vnL?|grep?-c?"$IP")?-eq?0?];?theniptables?-I?INPUT?-s?$IP?-j?DROP????fi done2)屏蔽每分鐘SSH嘗試登錄超過(guò)10次的IP
方法1:通過(guò)lastb獲取登錄狀態(tài):
#!/bin/bash DATE=$(date?+"%a?%b?%e?%H:%M")?#星期月天時(shí)分??%e單數(shù)字時(shí)顯示7,而%d顯示07 ABNORMAL_IP=$(lastb?|grep?"$DATE"?|awk?'{a[$3]++}END{for(i?in?a)if(a[i]>10)print?i}')for?IP?in?$ABNORMAL_IP;?doif?[?$(iptables?-vnL?|grep?-c?"$IP")?-eq?0?];?theniptables?-I?INPUT?-s?$IP?-j?DROP????fidone方法2:通過(guò)日志獲取登錄狀態(tài)
#!/bin/bash DATE=$(date?+"%b?%d?%H") ABNORMAL_IP="$(tail?-n10000?/var/log/auth.log?|grep?"$DATE"?|awk?'/Failed/{a[$(NF-3)]++}END{for(i?in?a)if(a[i]>5)print?i}')" for?IP?in?$ABNORMAL_IP;?doif?[?$(iptables?-vnL?|grep?-c?"$IP")?-eq?0?];?theniptables?-A?INPUT?-s?$IP?-j?DROP????????echo?"$(date?+"%F?%T")?-?iptables?-A?INPUT?-s?$IP?-j?DROP"?>>~/ssh-login-limit.log????fi done17、根據(jù)web訪問(wèn)日志,封禁請(qǐng)求量異常的IP,如IP在半小時(shí)后恢復(fù)正常,則解除封禁
#!/bin/bash #################################################################################### #根據(jù)web訪問(wèn)日志,封禁請(qǐng)求量異常的IP,如IP在半小時(shí)后恢復(fù)正常,則解除封禁 #################################################################################### logfile=/data/log/access.log #顯示一分鐘前的小時(shí)和分鐘 d1=`date?-d?"-1?minute"?+%H%M` d2=`date?+%M` ipt=/sbin/iptables ips=/tmp/ips.txt block() {? #將一分鐘前的日志全部過(guò)濾出來(lái)并提取IP以及統(tǒng)計(jì)訪問(wèn)次數(shù)grep?'$d1:'?$logfile|awk?'{print?$1}'|sort?-n|uniq?-c|sort?-n?>?$ips#利用for循環(huán)將次數(shù)超過(guò)100的IP依次遍歷出來(lái)并予以封禁for?i?in?`awk?'$1>100?{print?$2}'?$ips`?do$ipt?-I?INPUT?-p?tcp?--dport?80?-s?$i?-j?REJECT?echo?"`date?+%F-%T`?$i"?>>?/tmp/badip.log?done } unblock() {? #將封禁后所產(chǎn)生的pkts數(shù)量小于10的IP依次遍歷予以解封for?a?in?`$ipt?-nvL?INPUT?--line-numbers?|grep?'0.0.0.0/0'|awk?'$2<10?{print?$1}'|sort?-nr`?do?$ipt?-D?INPUT?$adone$ipt?-Z } #當(dāng)時(shí)間在00分以及30分時(shí)執(zhí)行解封函數(shù) if?[?$d2?-eq?"00"?]?||?[?$d2?-eq?"30"?]?then#要先解再封,因?yàn)閯倓偡饨麜r(shí)產(chǎn)生的pkts數(shù)量很少unblockblock?elseblock fi18、判斷用戶輸入的是否為IP地址
方法1:
#!/bin/bash function?check_ip(){IP=$1VALID_CHECK=$(echo?$IP|awk?-F.?'$1<?=255&&$2<=255&&$3<=255&&$4<=255{print?"yes"}')if?echo?$IP|grep?-E?"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null;?thenif?[?$VALID_CHECK?==?"yes"?];?thenecho?"$IP?available."elseecho?"$IP?not?available!"fielseecho?"Format?error!"fi } check_ip?192.168.1.1 check_ip?256.1.1.1方法2:
#!/bin/bash function?check_ip(){IP=$1if?[[?$IP?=~?^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$?]];?thenFIELD1=$(echo?$IP|cut?-d.?-f1)FIELD2=$(echo?$IP|cut?-d.?-f2)FIELD3=$(echo?$IP|cut?-d.?-f3)FIELD4=$(echo?$IP|cut?-d.?-f4)if?[?$FIELD1?-le?255?-a?$FIELD2?-le?255?-a?$FIELD3?-le?255?-a?$FIELD4?-le?255?];?thenecho?"$IP?available."elseecho?"$IP?not?available!"fielseecho?"Format?error!"fi } check_ip?192.168.1.1 check_ip?256.1.1.1增加版:
加個(gè)死循環(huán),如果IP可用就退出,不可用提示繼續(xù)輸入,并使用awk判斷。
#!/bin/bash function?check_ip(){local?IP=$1VALID_CHECK=$(echo?$IP|awk?-F.?'$1<?=255&&$2<=255&&$3<=255&&$4<=255{print?"yes"}')if?echo?$IP|grep?-E?"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"?>/dev/null;?thenif?[?$VALID_CHECK?==?"yes"?];?thenreturn?0elseecho?"$IP?not?available!"return?1fielseecho?"Format?error!?Please?input?again."return?1fi } while?true;?doread?-p?"Please?enter?IP:?"?IPcheck_ip?$IP[?$??-eq?0?]?&&?break?||?continue done?
?
?
end [歡迎關(guān)注微信公眾號(hào):廈門(mén)微思網(wǎng)絡(luò)]
?
?
總結(jié)
以上是生活随笔為你收集整理的绝了,这18 个开箱即用的 Shell 脚本值得收藏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Wi-Fi信号满格网速就一定快吗?
- 下一篇: 5W+人的公司怎么把总部和分部网络连接起