小編給大家分享一下linux中Shell有哪些使用示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、靈壽網(wǎng)站維護(hù)、網(wǎng)站推廣。
Shell腳本是幫助程序員和系統(tǒng)管理員完成費(fèi)時(shí)費(fèi)力的枯燥工作的利器,是與計(jì)算機(jī)交互并管理文件和系統(tǒng)操作的有效方式。區(qū)區(qū)幾行代碼,就可以讓計(jì)算機(jī)接近按照你的意圖行事。
#!/bin/bash ############################################################################################################################### #需求: #1.每隔10s監(jiān)控httpd的進(jìn)程數(shù),若進(jìn)程數(shù)大于等于500,則自動重啟Apache服務(wù),并檢測服務(wù)是否重啟成功 #2.若未成功則需要再次啟動,若重啟5次依舊沒有成功,則向管理員發(fā)送告警郵件,并退出檢測 #3.如果啟動成功,則等待1分鐘后再次檢測httpd進(jìn)程數(shù),若進(jìn)程數(shù)正常,則恢復(fù)正常檢測(10s一次),否則放棄重啟并向管理員發(fā)送告警郵件,并退出檢測 ############################################################################################################################### #計(jì)數(shù)器函數(shù) check_service() { j=0 for i in `seq 1 5` do #重啟Apache的命令 /usr/local/apache2/bin/apachectl restart 2> /var/log/httpderr.log #判斷服務(wù)是否重啟成功 if [ $? -eq 0 ] then break else j=$[$j+1] fi #判斷服務(wù)是否已嘗試重啟5次 if [ $j -eq 5 ] then mail.py exit fi done } while : do n=`pgrep -l httpd|wc -l` #判斷httpd服務(wù)進(jìn)程數(shù)是否超過500 if [ $n -gt 500 ] then /usr/local/apache2/bin/apachectl restart if [ $? -ne 0 ] then check_service else sleep 60 n2=`pgrep -l httpd|wc -l` #判斷重啟后是否依舊超過500 if [ $n2 -gt 500 ] then mail.py exit fi fi fi #每隔10s檢測一次 sleep 10 done
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); do USER=$(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_INFO expect -c " spawn ssh -p$PORT $USER@$IP set timeout 2 expect { \"(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
生成新密碼文件:
192.168.18.217 root n8wX3mU% 22 192.168.18.218 root c87;ZnnL 22
場景:惡意訪問,安全防范
1)屏蔽每分鐘訪問超過200的IP
方法1:根據(jù)訪問日志(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防止文件過大,讀取慢,數(shù)字可調(diào)整每分鐘最大的訪問量。awk不能直接過濾日志,因?yàn)榘厥庾址?nbsp;for IP in $ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP fi done
方法2:通過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)的冒號和端口去掉 for IP in $ABNORMAL_IP; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP fi done
2)屏蔽每分鐘SSH嘗試登錄超過10次的IP
方法1:通過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; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -I INPUT -s $IP -j DROP fi done
方法2:通過日志獲取登錄狀態(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; do if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then iptables -A INPUT -s $IP -j DROP echo "$(date +"%F %T") - iptables -A INPUT -s $IP -j DROP" >>~/ssh-login-limit.log fi done
#!/bin/bash #################################################################################### #根據(jù)web訪問日志,封禁請求量異常的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() { #將一分鐘前的日志全部過濾出來并提取IP以及統(tǒng)計(jì)訪問次數(shù) grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips #利用for循環(huán)將次數(shù)超過100的IP依次遍歷出來并予以封禁 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 $a done $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ù)量很少 unblock block else block fi
方法1:
#!/bin/bash function check_ip(){ IP=$1 VALID_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; then if [ $VALID_CHECK == "yes" ]; then echo "$IP available." else echo "$IP not available!" fi else echo "Format error!" fi } check_ip 192.168.1.1 check_ip 256.1.1.1
方法2:
#!/bin/bash function check_ip(){ IP=$1 if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then FIELD1=$(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 ]; then echo "$IP available." else echo "$IP not available!" fi else echo "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=$1 VALID_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; then if [ $VALID_CHECK == "yes" ]; then return 0 else echo "$IP not available!" return 1 fi else echo "Format error! Please input again." return 1 fi } while true; do read -p "Please enter IP: " IP check_ip $IP [ $? -eq 0 ] && break || continue done
以上是“l(fā)inux中Shell有哪些使用示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!