shell指令碼應用(三)
前言:當面對各種列表重複任務時,使用if語句已經難以滿足要求,而順序編寫全部程式碼更是顯得異常繁瑣,困難重重。使用迴圈、分支等其他程式控制結構,從而能夠輕鬆完成更加複雜、強大的功能。
1、使用for迴圈語句
1)根據姓名列表批量新增使用者
準備員工列表檔案users.txt,然後編寫一個名為uaddfor.sh的指令碼,從users.txt檔案中讀取各使用者名稱稱,重複執行新增使用者,設定初始密碼的相關操作。
Vi /root/users.txt
Vi uaddfor.sh
執行指令碼:./uaddfor.sh之後檢視使用者檔案cat /etc/passwd
2)若要刪除uaddfor.sh指令碼新增的使用者,只需要將上面指令碼中新增使用者的命令改為刪除的即可。
Vi udelfor.sh
執行指令碼之後發現使用者已經刪除
3)根據ip地址列表檢視主機狀態
首先建立ip地址列表檔案ipadds.txt,然後編寫一個名為chkhosts.sh的shell指令碼,從ipadds.txt檔案中讀取各伺服器的ip地址,重複執行ping連通性測試,並根據測試結果輸出相應的提示資訊。
Vi /root/ipadds.txt
編寫指令碼vi chkhosts.sh
執行指令碼
2、使用while迴圈語句
For迴圈適合無規律,列表已固定,while迴圈適合要求迴圈次數,操作物件按數字順序編號,按特定條件執行重複操作的情況。
1)批量新增規律編號的使用者,新增20個使用者,名稱依次為stu1
Vi uaddwhile.sh
執行指令碼之後檢視使用者:cat /etc/passwd
2)刪除所新增的使用者,只需將上述程式碼修改即可
Vi udelwhile.sh
執行指令碼之後檢視使用者是否被刪除
3)猜價格遊戲
思路:通過環境變數RANDOM可獲得一個小於2的16次方的隨機整數,計算其與1000的餘數即可獲得0-999的隨機價格,反覆猜測操作可以通過以true作為測試條件的while迴圈實現,當用戶猜中實際價格時終止迴圈,判斷猜測價格與實際價格的過程採用if語句實現,巢狀在while迴圈體內,使用變數來記錄猜測次數。
Vi pricegame.sh
Chmod +x pricegame.sh
./pricegame.sh執行指令碼
3、使用case分支語句
Case語句可以使用指令碼程式的結構更加清晰。
1)檢查使用者輸入一個字元,通過case語句判斷該字元是否為字母,陣列或其他控制字元,並給出相應的提示資訊。
Vi hitkey.sh
執行指令碼的效果:
2)編寫系統服務指令碼
通過位置變數$1指定的start,stop,restart,status控制引數,分別用來啟動、停止、重啟sleep程序,以及檢視sleep程序的狀態。
Vi myprog
然後執行下面的命令新增myprog為系統服務
綜合案例
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
…… //省略部分內容
執行指令碼之後檢視/etc/ethers檔案
chmod +x getarp
./getarp
Cat /etc/ethers
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上執行指令碼
在B上安裝vsftpd,如下圖所示:
Vim /etc/vsftpd/vsftpd.conf啟用匿名,預設就啟用了,我們檢視一下:
開啟ftp服務
Service vsftpd start
在A上登入ftp 192.168.1.2測試,如果不能使用ftp命令,則需要安裝ftp-0.17......
最後在A上執行指令碼./scanhost.sh
執行指令碼之後發現192.168.1.2開啟了ftp匿名登入。
轉載於:https://blog.51cto.com/fengjicheng/1875415