天天看點

bash代碼 驗證某台主機是否線上,建使用者賬戶并設定密碼,删除賬戶

        使用雙分支的 if 條件語句來驗證某台主機是否線上,然後根據傳回值的結果,要麼顯示主機線上資訊,要麼顯示主機不線上資訊。這裡的腳本主要使用 ping 指令來測試與對方主機的網絡聯通性,而 Linux 系統中的 ping 指令不像 Windows 一樣嘗試 4 次就結束,是以為了避免使用者等待時間過長,需要通過-c 參數來規定嘗試的次數,并使用-i 參數定義每個資料包的發送間隔,以及使用-W 參數定義等待逾時時間。

chkhost.sh内容

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
           

事例:

[[email protected] ch4]# sh chkhost.sh 192.168.1.1
Host 192.168.1.1 is On-line.
[[email protected] ch4]# sh chkhost.sh 192.168.1.2
Host 192.168.1.2 is Off-line.
           

       下面使用 for 循環語句從清單檔案中讀取多個使用者名,然後為其逐一建立使用者賬戶并設定密碼。首先建立使用者名稱的清單檔案 users.txt,每個使用者名稱單獨一行。讀者可以自行決定具體的使用者名稱和個數:

[[email protected] ch4]# vim users.txt 
andy 
barry
carl
duke
eric
george
           

         接下來編寫 Shell 腳本 Example.sh。在腳本中使用 read 指令讀取使用者輸入的密碼值,然後指派給 PASSWD 變量,并通過-p 參數向使用者顯示一段提示資訊,告訴使用者正在輸入的内容即将作為賬戶密碼。在執行該腳本後,會自動使用從清單檔案 users.txt 中擷取到所有的使用者名稱,然後逐一使用“id 使用者名”指令檢視使用者的資訊,并使用$?判斷這條指令是否執行成功,也就是判斷該使用者是否已經存在。需要多說一句,/dev/null 是一個被稱作 Linux 黑洞的檔案,把輸出資訊重定向到這個檔案等同于删除資料(類似于沒有回收功能的垃圾箱),可以讓使用者的螢幕視窗保持簡潔。

#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
        if [ $? -eq 0 ]
        then
                echo "Already exists"
        else
                useradd $UNAME &> /dev/null
                echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
                if [ $? -eq 0 ]
                then
                        echo  "$UNAME,Create success"
                else
                        echo "$UNAME,Create failure"
                fi
        fi
done
           

執行批量建立使用者的 Shell 腳本 Example.sh,在輸入為賬戶設定的密碼後将由腳本自動檢查并建立這些賬戶。由于已經将多餘的資訊通過輸出重定向符轉移到了/dev/null 黑洞檔案中,是以在正常情況下螢幕視窗除了“使用者賬戶建立成功”(Create success)的提示後不會有其他内容。在 Linux 系統中,/etc/passwd 是用來儲存使用者賬戶資訊的檔案。如果想确認這個腳本是否成功建立了使用者賬戶,可以打開這個檔案,看其中是否有這些新建立的使用者資訊。

[[email protected] ch4]# sh Example.sh 
Enter The Users Password : 1111111
andy,Create success
barry,Create success
carl,Create success
duke,Create success
eric,Create success
george,Create success
[[email protected] ch4]# tail -6 /etc/passwd
andy:x:504:506::/home/andy:/bin/bash
barry:x:505:507::/home/barry:/bin/bash
carl:x:506:508::/home/carl:/bin/bash
duke:x:507:509::/home/duke:/bin/bash
eric:x:508:510::/home/eric:/bin/bash
george:x:509:511::/home/george:/bin/bash
           

參照上面的例子,批量删除使用者的bash 腳本

#!/bin/bash
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
        if [ $? -eq 0 ]
        then
                userdel $UNAME &> /dev/null
                if [ $? -eq 0 ]
                then
                        echo  "delete $UNAME success"
                else
                        echo "delete  failure"
                fi
        else
                echo "$UNAME is\'t not exists"
        fi
done
~
           

您還記得在學習雙分支 if 條件語句時,用到的那個測試主機是否線上的腳本麼?既然我們現在已經掌握了 for 循環語句,不妨做些更酷的事情,比如嘗試讓腳本從文本中自動讀取主機清單,然後自動逐個測試這些主機是否線上。

首先建立一個主機清單檔案 ipadds.txt:

[[email protected] ch4]# cat ipadds.txt 
192.168.1.1
192.168.1.2
www.baidu.com
www.sina.com
www.163.com
www.aaa.com
           

       然後前面的雙分支 if 條件語句與 for 循環語句相結合,讓腳本從主機清單檔案 ipadds.txt中自動讀取 IP 位址(用來表示主機)并将其指派給 HLIST 變量,進而通過判斷 ping 指令執行後的傳回值來逐個測試主機是否線上。腳本中出現的$(指令)是一種完全類似于第 3 章的轉義字元中反引号`指令`的 Shell 操作符,效果同樣是執行括号或雙引号括起來的字元串中的指令。大家在編寫腳本時,多學習幾種類似的新方法,可在工作中大顯身手:

#!/bin/bash
HLIST=$(cat ./ipadds.txt)
for IP in $HLIST
do
        ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
        if [ $? -eq 0 ]; then
        echo "Host $IP is On-line."
        else
        echo "Host $IP is Off-line."
        fi
done

[[email protected] ch4]# sh CheckHosts.sh 
Host 192.168.1.1 is On-line.
Host 192.168.1.2 is Off-line.
Host www.baidu.com is On-line.
Host www.sina.com is On-line.
Host www.163.com is On-line.
Host www.aaa.com is Off-line.
           

繼續閱讀