1. 程式人生 > 實用技巧 >shell指令碼應用(三)

shell指令碼應用(三)


前言:當面對各種列表重複任務時,使用if語句已經難以滿足要求,而順序編寫全部程式碼更是顯得異常繁瑣,困難重重。使用迴圈、分支等其他程式控制結構,從而能夠輕鬆完成更加複雜、強大的功能。

1、使用for迴圈語句

1)根據姓名列表批量新增使用者

準備員工列表檔案users.txt,然後編寫一個名為uaddfor.sh的指令碼,從users.txt檔案中讀取各使用者名稱稱,重複執行新增使用者,設定初始密碼的相關操作。

Vi /root/users.txt

wKioL1gz5FizFiEhAAAevKO9-uE247.png


Vi uaddfor.sh

wKioL1gz5FiCHDlfAABUSmkJULM111.png


執行指令碼:./uaddfor.sh之後檢視使用者檔案cat /etc/passwd

wKiom1gz5FiwqUGNAAA0pjwUwEo597.png


2)若要刪除uaddfor.sh指令碼新增的使用者,只需要將上面指令碼中新增使用者的命令改為刪除的即可。

wKioL1gz5FnigrwDAAAwDvAr6w4557.png


Vi udelfor.sh

wKiom1gz5FnjSw3nAAA6yYiYPek826.png

執行指令碼之後發現使用者已經刪除

3)根據ip地址列表檢視主機狀態

首先建立ip地址列表檔案ipadds.txt,然後編寫一個名為chkhosts.shshell指令碼,從ipadds.txt檔案中讀取各伺服器的ip地址,重複執行ping連通性測試,並根據測試結果輸出相應的提示資訊。

Vi /root/ipadds.txt

wKioL1gz5FmTrX2hAAAdbTUjbNs714.png


編寫指令碼vi chkhosts.sh

wKiom1gz5FqBPxZfAABM7yC6MGA715.png


執行指令碼

wKiom1gz5FqRfgpFAAA0lu_J3U4762.png


2、使用while迴圈語句

For迴圈適合無規律,列表已固定,while迴圈適合要求迴圈次數,操作物件按數字順序編號,按特定條件執行重複操作的情況。

1)批量新增規律編號的使用者,新增20個使用者,名稱依次為stu1

stu2... Stu20

Vi uaddwhile.sh

wKioL1gz5FqTw4bdAABIEW-7g-Y308.png


執行指令碼之後檢視使用者:cat /etc/passwd

wKiom1gz5FvxOXd_AAAYSnviPG8557.png


2)刪除所新增的使用者,只需將上述程式碼修改即可

wKiom1gz5HOytrlTAAAitOim6kI698.png


Vi udelwhile.sh

wKioL1gz5HOzGUZkAAAzkzyLNSU293.png

執行指令碼之後檢視使用者是否被刪除

3)猜價格遊戲

思路:通過環境變數RANDOM可獲得一個小於216次方的隨機整數,計算其與1000的餘數即可獲得0-999的隨機價格,反覆猜測操作可以通過以true作為測試條件的while迴圈實現,當用戶猜中實際價格時終止迴圈,判斷猜測價格與實際價格的過程採用if語句實現,巢狀在while迴圈體內,使用變數來記錄猜測次數。

Vi pricegame.sh

wKioL1gz5HOCZjzzAABwNrNysw0539.png


Chmod +x pricegame.sh

./pricegame.sh執行指令碼

wKiom1gz5HSjf89qAACI010htMY816.png


3、使用case分支語句

Case語句可以使用指令碼程式的結構更加清晰。

1)檢查使用者輸入一個字元,通過case語句判斷該字元是否為字母,陣列或其他控制字元,並給出相應的提示資訊。

Vi hitkey.sh

wKiom1gz5HSSSKh-AABHhjo1nqE244.png


執行指令碼的效果:

wKioL1gz5HSzdV2jAABLF4tdHJ8011.png


2)編寫系統服務指令碼

通過位置變數$1指定的startstoprestartstatus控制引數,分別用來啟動、停止、重啟sleep程序,以及檢視sleep程序的狀態。

Vi myprog

wKiom1gz5HWi0q_FAABtpSQlaYM809.png


然後執行下面的命令新增myprog為系統服務

wKioL1gz5HWzpa66AABx08ihYZo724.png





綜合案例

1、編寫getarp.sh指令碼檔案

1)通過arping命令傳送ARP請求,根據反饋結果記錄MAC地址。

2)將網段地址(如192.168.4.)賦值給變數NADD,作為檢測地址的字首。

3)使用while迴圈語句,重複檢測目標並記錄MAC地址,主機地址從1-254

[[email protected]ocalhost ~]# vi getarp.sh

#!/bin/bash

# 1. 定義網段地址、MAC列表檔案

NADD="192.168.4."

FILE="/etc/ethers"

# 2. 傳送ARP請求,並記錄反饋結果

[ -f $FILE ] && /bin/cp -f $FILE $FILE.old //備份原有檔案

HADD=1 //定義起始掃描地址

while [ $HADD -lt 128 ]

do

arping -c 2 -w 1 ${NADD}${HADD} &> /dev/null

if [ $? -eq 0 ] ; then

arp -n | grep ${NADD}${HADD} | awk '{print $1,$3}' >> $FILE

fi

let HADD++

done

[[email protected] ~]# chmod +x getarp.sh

[[email protected] ~]# ./getarp.sh//執行檢測程式

[[email protected] ~]# cat /etc/ethers//確認記錄結果

192.168.4.12 00:0C:29:C3:F8:51

192.168.4.110 00:50:56:C0:00:01

…… //省略部分內容

wKiom1gz5HaTo8dlAABj5TFGmwg389.png


執行指令碼之後檢視/etc/ethers檔案

chmod +x getarp

./getarp

Cat /etc/ethers

wKioL1gz5HbAzafxAAAwI8O99bQ876.png


2、編寫scanhost.sh指令碼

1)有很多方法可以檢測一個主機是否開啟匿名FTP服務,這裡採取以wget下載工具訪問FTP根目錄的方式,若能夠成功列表,則視為匿名FTP已開啟,否則視為關閉。

2)通過awk命令過濾出/etc/ethers檔案中的所有IP地址,賦值給變數TARGET

3)使用for迴圈語句,讀取TARGET變數中的IP地址,重複探測FTP開啟情況。

[[email protected] ~]# vi scanhost.sh

#!/bin/bash

TARGET=$(awk '{print $1}' /etc/ethers)

echo "以下主機已開放匿名FTP服務:"

for IP in $TARGET

do

wget ftp://$IP/ &> /dev/null

if [ $? -eq 0 ] ; then

echo $IP

rm -rf index.html //刪除測試產生的臨時檔案

fi

done

[[email protected] ~]# chmod +x scanhost.sh

執行指令碼之前在另一臺linux伺服器B192.168.1.2上搭建ftp服務(使用vsftpd軟體),然後在linuxA上執行指令碼

wKiom1gz5ImyMQ9dAADsiIGzSBQ021.png

B上安裝vsftpd,如下圖所示:

wKioL1gz5IqilPEPAACUHQvs37E794.png


Vim /etc/vsftpd/vsftpd.conf啟用匿名,預設就啟用了,我們檢視一下:

wKiom1gz5Iqz5QuzAABdnqDP5Gs346.png


開啟ftp服務

Service vsftpd start

A上登入ftp 192.168.1.2測試,如果不能使用ftp命令,則需要安裝ftp-0.17......

wKioL1gz5IuA-pWfAACHvof4jUE496.png


wKiom1gz5IuR0jQvAABA7pAEa1I318.png


最後在A上執行指令碼./scanhost.sh

wKioL1gz5IyDz98TAAA0cs9JDnk332.png

執行指令碼之後發現192.168.1.2開啟了ftp匿名登入。





轉載於:https://blog.51cto.com/fengjicheng/1875415