1. 程式人生 > 其它 >Red Hat Enterprise Linux 8系統學習(六)

Red Hat Enterprise Linux 8系統學習(六)

技術標籤:Linux就該這麼學shelllinuxrhelcentos伺服器

Red Hat Enterprise Linux 8系統學習(六)

一、for條件迴圈語句

for迴圈語句允許指令碼一次性讀取多個資訊,然後逐一對資訊進行操作處理,當要處理的資料有範圍時,使用for迴圈語句再適合不過了。for迴圈語句的語法格式如下圖所示。

第4章 Vim編輯器與Shell命令指令碼第4章 Vim編輯器與Shell命令指令碼

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

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

接下來編寫Shell指令碼addusers.sh。在指令碼中使用read命令讀取使用者輸入的密碼值,然後賦值給PASSWD變數,通過-p引數向用戶顯示一段提示資訊,告訴使用者正在輸入的內容即將作為賬戶密碼。在執行該指令碼後,會自動使用從列表檔案users.txt中獲取到所有的使用者名稱稱,然後逐一使用“id 使用者名稱”命令檢視使用者的資訊,並使用$?判斷這條命令是否執行成功,也就是判斷該使用者是否已經存在。

[[email protected] ~]# vim addusers.sh
#!/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 "$UNAME , Already exists"
        else
                useradd $UNAME &> /dev/null
                echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
                echo "$UNAME , Create success"
        fi
done

Tips

/dev/null是一個被稱作Linux黑洞的檔案,把輸出資訊重定向到這個檔案等同於刪除資料(類似於沒有回收功能的垃圾箱),可以讓使用者的螢幕視窗保持簡潔。

執行批量建立使用者的Shell指令碼addusers.sh,在輸入為賬戶設定的密碼後將由指令碼自動檢查並建立這些賬戶。由於已經將多餘的資訊通過輸出重定向符轉移到了/dev/null黑洞檔案中,因此在正常情況下螢幕視窗除了“使用者賬戶建立成功”(Create success)的提示後不會有其他內容。

在Linux系統中,/etc/passwd是用來儲存使用者賬戶資訊的檔案。如果想確認這個指令碼是否成功建立了使用者賬戶,可以開啟這個檔案,看其中是否有這些新建立的使用者資訊。

[[email protected] ~]# bash addusers.sh
Enter The Users Password : zjs
andy , Create success
barry , Create success
carl , Create success
duke , Create success
eric , Create success
george , Create success
[[email protected] ~]# tail -6 /etc/passwd
andy:x:1001:1001::/home/andy:/bin/bash
barry:x:1002:1002::/home/barry:/bin/bash
carl:x:1003:1003::/home/carl:/bin/bash
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash

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

首先建立一個主機列表檔案ipaddrs.txt:

[[email protected] ~]# vim ipaddrs.txt
192.168.10.10
192.168.10.11
192.168.10.12

然後前面的雙分支if條件語句與for迴圈語句相結合,讓指令碼從主機列表檔案ipaddrs.txt中自動讀取IP地址(用來表示主機)並將其賦值給HLIST變數,從而通過判斷ping命令執行後的返回值來逐個測試主機是否線上。指令碼中出現的$(命令)是一種完全類似於轉義字元中反引號命令的Shell操作符,效果同樣是執行括號或雙引號括起來的字串中的命令。

二、while條件迴圈語句

如果您之前學習過C語言,看到這一小節的標題肯定會會心一笑“這不就是switch語句嘛!”是的,case條件測試語句和switch語句的功能非常相似!case語句是在多個範圍內匹配資料,若匹配成功則執行相關命令並結束整個條件測試;而如果資料不在所列出的範圍內,則會去執行星號(*)中所定義的預設命令。case語句的語法結構如下圖所示。

第4章 Vim編輯器與Shell命令指令碼第4章 Vim編輯器與Shell命令指令碼

在前文介紹的Guess.sh指令碼中有一個致命的弱點—只能接受數字!您可以嘗試輸入一個字母,會發現指令碼立即就崩潰了。原因是字母無法與數字進行大小比較,例如,“a是否大於等於3”這樣的命題是完全錯誤的。必須有一定的措施來判斷使用者的輸入內容,當用戶輸入的內容不是數字時,指令碼能予以提示,從而免於崩潰。

通過在指令碼中組合使用case條件測試語句和萬用字元,完全可以滿足這裡的需求。接下來我們編寫指令碼Checkkeys.sh,提示使用者輸入一個字元並將其賦值給變數KEY,然後根據變數KEY的值向用戶顯示其值是字母、數字還是其他字元。

[[email protected] ~]# vim Checkkeys.sh
#!/bin/bash
read -p "請輸入一個字元,並按Enter鍵確認:" KEY
case "$KEY" in
        [a-z]|[A-Z])
                echo "您輸入的是 字母。"
                ;;
        [0-9])
                echo "您輸入的是 數字。"
                ;;
        *)
                echo "您輸入的是 空格、功能鍵或其他控制字元。"
esac
[[email protected] ~]# bash Checkkeys.sh
請輸入一個字元,並按Enter鍵確認:6
您輸入的是 數字。
[[email protected] ~]# bash Checkkeys.sh
請輸入一個字元,並按Enter鍵確認:p
您輸入的是 字母。
[[email protected] ~]# bash Checkkeys.sh
請輸入一個字元,並按Enter鍵確認:^[[15~
您輸入的是 空格、功能鍵或其他控制字元。

三、case條件測試語句

case語句是在多個範圍內匹配資料,若匹配成功則執行相關命令並結束整個條件測試;而如果資料不在所列出的範圍內,則會去執行星號(*)中所定義的預設命令。case語句的語法結構如下圖所示。

第4章 Vim編輯器與Shell命令指令碼第4章 Vim編輯器與Shell命令指令碼

在前文介紹的Guess.sh指令碼中有一個致命的弱點—只能接受數字!您可以嘗試輸入一個字母,會發現指令碼立即就崩潰了。原因是字母無法與數字進行大小比較,例如,“a是否大於等於3”這樣的命題是完全錯誤的。必須有一定的措施來判斷使用者的輸入內容,當用戶輸入的內容不是數字時,指令碼能予以提示,從而免於崩潰。

接下來我們編寫指令碼Checkkeys.sh,提示使用者輸入一個字元並將其賦值給變數KEY,然後根據變數KEY的值向用戶顯示其值是字母、數字還是其他字元。

[[email protected] ~]# vim Checkkeys.sh
#!/bin/bash
read -p "請輸入一個字元,並按Enter鍵確認:" KEY
case "$KEY" in
        [a-z]|[A-Z])
                echo "您輸入的是 字母。"
                ;;
        [0-9])
                echo "您輸入的是 數字。"
                ;;
        *)
                echo "您輸入的是 空格、功能鍵或其他控制字元。"
esac
[[email protected] ~]# bash Checkkeys.sh
請輸入一個字元,並按Enter鍵確認:6
您輸入的是 數字。
[[email protected] ~]# bash Checkkeys.sh
請輸入一個字元,並按Enter鍵確認:p
您輸入的是 字母。
[[email protected] ~]# bash Checkkeys.sh
請輸入一個字元,並按Enter鍵確認:^[[15~
您輸入的是 空格、功能鍵或其他控制字元。

四、計劃任務服務程式

at 一次性

crond 週期性

at命令的引數及其作用

引數作用
-f指定包含命令的任務檔案
-q指定新任務名稱
-l顯示待執行任務列表
-d刪除指定待執行任務
-m任務執行後給使用者發郵件

在使用at命令來設定一次性計劃任務時,預設採用的是互動式方法。例如,使用下述命令將系統設定為在今晚23:30分自動重啟網站服務。

[[email protected] ~]# at 23:30
warning: commands will be executed using /bin/sh
at> systemctl restart httpd
at> 此處請同時按下<Ctrl>+<d>鍵來結束編寫計劃任務
job 1 at Wed Oct 14 23:30:00 2020
[[email protected] ~]# at -l
1 Wed Oct 14 23:30:00 2020 a root

crond [服務名稱]

crontab [工具名稱]

contab命令的引數及其作用

引數作用
-e編輯計劃任務
-u指定使用者名稱稱
-l列出任務列表
-r刪除計劃任務

在正式部署計劃任務時,使用“分、時、日、月、星期、命令”引數格式(其格式見下表)。需要注意的是,如果有些欄位沒有被設定,則需要使用星號(*****)佔位,如下圖。第4章 Vim編輯器與Shell命令指令碼第4章 Vim編輯器與Shell命令指令碼

使用crond設定任務的引數欄位說明

欄位說明
分鐘取值為0~59的整數
小時取值為0~23的任意整數
日期取值為1~31的任意整數
月份取值為1~12的任意整數
星期取值為0~7的任意整數,其中0與7均為星期日
命令要執行的命令或程式指令碼

假設在每週一、三、五的凌晨3點25分,都需要使用tar命令把某個網站的資料目錄進行打包處理,使其作為一個備份檔案。我們可以使用crontab -e命令來建立計劃任務,為自己建立計劃任務無需使用-u引數,具體的實現效果的引數如crontab -l命令結果所示:

[[email protected] ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[[email protected] ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

需要說明的是,除了用逗號(,)來分別表示多個時間段,例如“8,9,12”表示8月、9月和12月。還可以用減號(-)來表示一段連續的時間週期(例如欄位“日”的取值為“12-15”,則表示每月的12~15日)。以及用除號(/)表示執行任務的間隔時間(例如“*/2”表示每隔2分鐘執行一次任務)。

如果在crond服務中需要同時包含多條計劃任務的命令語句,應每行僅寫一條。例如再新增一條計劃任務,它的功能是每週一至週五的凌晨1點鐘自動清空/tmp目錄內的所有檔案。尤其需要注意的是,在crond服務的計劃任務引數中,所有命令一定要用絕對路徑的方式來寫,如果不知道絕對路徑,請用whereis命令進行查詢,rm命令路徑為下面輸出資訊中加粗部分。

[[email protected] ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
[[email protected] ~]# crontab -e
crontab: installing new crontab
[[email protected] ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

總結一下使用計劃服務的注意事項——在crond服務的配置引數中,可以像Shell指令碼那樣以#號開頭寫上註釋資訊,這樣在日後回顧這段命令程式碼時可以快速瞭解其功能、需求以及編寫人員等重要資訊。另外,計劃任務中的“分”欄位必須有數值,絕對不能為空或是*號,而“日”和“星期”欄位不能同時使用,否則就會發生衝突。

刪除crond計劃任務則非常簡單,可以使用crontab -e命令進入到編輯介面中,刪除裡面的文字資訊即可,也可以使用crontab -r命令直接進行刪除:

[[email protected] ~]# crontab -r
[[email protected] ~]# crontab -l
no crontab for root

五、使用者身份與許可權

管理員 UID 0 root

系統使用者

RHEL5/6 1-499

RHEL7/8 1-999

普通使用者

RHEL5/6 500-65535

RHEL7/8 1000~

5.1、useradd

useradd命令用於建立新的使用者賬戶.

語法格式為:“useradd [引數] 使用者名稱”。

useradd命令中的引數以及作用

引數作用
-d指定使用者的家目錄(預設為/home/username)
-e賬戶的到期時間,格式為YYYY-MM-DD.
-u指定該使用者的預設UID
-g指定一個初始的使用者基本組(必須已存在)
-G指定一個或多個擴充套件使用者組
-N不建立與使用者同名的基本使用者組
-s指定該使用者的預設Shell直譯器

5.2、groupadd

groupadd命令用於建立新的使用者組。

語法格式為:“groupadd [引數] 群組名”。

5.3、usermod

usermod命令用於修改使用者的屬性。

語法格式為:“ usermod [引數] 使用者名稱”。

usermod命令中的引數以及作用

引數作用
-c填寫使用者賬戶的備註資訊
-d -m引數-m與引數-d連用,可重新指定使用者的家目錄並自動把舊的資料轉移過去
-e賬戶的到期時間,格式為YYYY-MM-DD
-g變更所屬使用者組
-G變更擴充套件使用者組
-L鎖定使用者禁止其登入系統
-U解鎖使用者,允許其登入系統
-s變更預設終端
-u修改使用者的UID

5.4、passwd

passwd命令用於修改使用者的密碼、過期時間等資訊。

語法格式為:“ passwd [引數] 使用者名稱”。

passwd命令中的引數以及作用

引數作用
-l鎖定使用者,禁止其登入
-u解除鎖定,允許使用者登入
–stdin允許通過標準輸入修改使用者密碼,如echo “NewPassWord” | passwd --stdin Username
-d使該使用者可用空密碼登入系統
-e強制使用者在下次登入時修改密碼
-S顯示使用者的密碼是否被鎖定,以及密碼所採用的加密演算法名稱

5.5、userdel

userdel命令用於刪除已有的使用者賬戶。

語法格式為:“ userdel [引數] 使用者名稱”。

userdel命令中的引數以及作用

引數作用
-f強制刪除使用者
-r同時刪除使用者及使用者家目錄

2021/1/15