
一、Vim 文本編輯器
在 Linux 系統(tǒng)中一切都是文件,而配置一個(gè)服務(wù)就是在修改其配置文件的參數(shù)
1. Vim 編輯器模式
| vim 編輯器模式 | 說明 |
|---|---|
命令模式默認(rèn)
|
控制光標(biāo)移動(dòng),可對(duì)文本進(jìn)行復(fù)制、粘貼、刪除和查找等工作 |
| 編輯模式 | 正常的文本錄入 |
| 末行模式 | 保存或退出文檔,以及設(shè)置編輯環(huán)境 |
Vim 編輯器模式的切換方法

提示:
- 在每次運(yùn)行 Vim 編輯器時(shí),默認(rèn)進(jìn)入命令模式,此時(shí)需要先切換到輸入模式后再進(jìn)行文檔編寫工作,而每次在編寫完文檔后需要先返回命令模式,然后再進(jìn)入末行模式,執(zhí)行文檔的保存或退出操作
- 在 Vim 中,無法直接從輸入模式切換到末行模式
末行模式中可用的命令
- 末行模式主要用于保存或退出文件,以及設(shè)置 Vim 編輯器的工作環(huán)境,還可以讓用戶執(zhí)行外部的 Linux 命令或跳轉(zhuǎn)到所編寫文檔的特定行數(shù)
| 命令 | 作用 |
|---|---|
:w |
保存 |
:q |
退出 |
:q! |
強(qiáng)制退出(放棄對(duì)文檔的修改) |
:wq! |
強(qiáng)制保存退出 |
:set nu |
顯示行號(hào) |
:set nonu |
不顯示行號(hào) |
:命令 |
執(zhí)行該命令 |
:整數(shù) |
跳轉(zhuǎn)到該行 |
:s/one/two |
將當(dāng)前光標(biāo)所在行的第一個(gè) one 替換成 two |
:s/one/two/g |
將當(dāng)前光標(biāo)所在行的所有 one 替換成 two |
:%s/one/two/g |
將全文中的所有 one 替換成 two |
?字符串 |
在文本中從下至上搜索該字符串 |
/字符串 |
在文本中從上至下搜索該字符串 |
Vim 編輯器
a、 i、 o 三個(gè)鍵從命令模式切換到輸入模式
- a 鍵與 i 鍵分別是在光標(biāo)后面一位和光標(biāo)當(dāng)前位置切換到輸入模式
- o 鍵則是在光標(biāo)的下面再創(chuàng)建一個(gè)空行,此時(shí)可敲擊 a 鍵進(jìn)入到編輯器的輸入模式
2. Vim 中常用的命令
| 命令 | 作用 |
|---|---|
dd |
刪除(剪切)光標(biāo)所在整行 |
5dd |
刪除(剪切)從光標(biāo)處開始的 5 行 |
yy |
復(fù)制光標(biāo)所在整行 |
5yy |
復(fù)制從光標(biāo)處開始的 5 行 |
n |
顯示搜索命令定位到的下一個(gè)字符串 |
N |
顯示搜索命令定位到的上一個(gè)字符串 |
u |
撤銷上一步的操作 |
p |
將之前刪除(dd)或復(fù)制(yy)過的數(shù)據(jù)粘貼到光標(biāo)后面 |
二、配置主機(jī)名稱
為了便于在局域網(wǎng)中查找某臺(tái)特定的主機(jī),或者對(duì)主機(jī)進(jìn)行區(qū)分,除了要有 IP 地址外,還要為主機(jī)配置一個(gè)主機(jī)名,主機(jī)之間可以通過這個(gè)類似于域名的名稱來相互訪問
- 修改主機(jī)名稱文件
vim /etc/hostname - 查看主機(jī)名
hostname
三、配置網(wǎng)卡
網(wǎng)卡 IP 地址配置的是否正確是兩臺(tái)服務(wù)器是否可以相互通信的前提
在 Linux 系統(tǒng)中,一切都是文件,因此配置網(wǎng)絡(luò)服務(wù)的工作其實(shí)就是在編輯網(wǎng)卡配置文件
提示:
- 在 RHEL 5、 RHEL 6 中,網(wǎng)卡配置文件的前綴為 eth,第 1 塊網(wǎng)卡為eth0,第 2 塊網(wǎng)卡為 eth1,以此類推
- 在 RHEL 7 中,網(wǎng)卡配置文件的前綴則以 ifcfg開始,加上網(wǎng)卡名稱共同組成了網(wǎng)卡配置文件的名字,例如 ifcfg-eno16777736;好在除了文件名變化外也沒有其他大的區(qū)別
cd /etc/sysconfig/network-scripts
ls

vim ifcfg-ens33
默認(rèn)

提示:
- 配置為開機(jī)自啟動(dòng),并且 IP地址、子網(wǎng)、網(wǎng)關(guān)等信息由人工指定
參數(shù) 說明 設(shè)備類型 TYPE=Ethernet 地址分配模式 BOOTPROTO=static 網(wǎng)卡名稱 NAME=ens3 是否啟動(dòng) ONBOOT=yes IP 地址 IPADDR=192.168.10.10 子網(wǎng)掩碼 NETMASK=255.255.255.0 網(wǎng)關(guān)地址 GATEWAY=192.168.10.1 DNS 地址 DNS1=192.168.10.1
- 重啟網(wǎng)卡設(shè)備
systemctl restart network
四、配置 Yum 軟件倉庫
Yum 軟件倉庫的作用是為了進(jìn)一步簡(jiǎn)化 RPM 管理軟件的難度以及自動(dòng)分析所需軟件包及其依賴關(guān)系的技術(shù)
- 進(jìn)入yum配置文件夾
cd /etc/yum.repos.d/
ls

- 新建rhel7.repo
vim rhel7.repo
五、編寫 Shell 腳本
| 工作方式 | 英文 | 說明 |
|---|---|---|
| 交互式 | Interactive | 用戶每輸入一條命令就立即執(zhí)行 |
| 批處理 | Batch | 由用戶事先編寫好一個(gè)完整的 Shell 腳本, Shell 會(huì)一次性執(zhí)行腳本中諸多的命令 |
1. 編寫簡(jiǎn)單的腳本
- 查看當(dāng)前命令行終端解釋器
echo $SHELL

- 查看當(dāng)前所在工作路徑并列出當(dāng)前目錄下所有的文件及屬性信息
vim test.sh
#!/bin/bash
#For Example BY Ricsy
pwd
ls -al
提示:
- 第一行的腳本聲明(#!)用來告訴系統(tǒng)使用哪種 Shell 解釋器來執(zhí)行該腳本
- 第二行的注釋信息(#)是對(duì)腳本功能和某些命令的介紹信息,使得自己或他人在日后看到這個(gè)腳本內(nèi)容時(shí),可以快速知道該腳本的作用或一些警告信息
- 第三、四行的可執(zhí)行語句也就是我們平時(shí)執(zhí)行的 Linux 命令了
- 執(zhí)行
sh test.sh
或
chmod +x test.sh
./test.sh

2. 接收用戶的參數(shù)
Shell 腳本程序中的參數(shù)位置變量
提示:
- $0 對(duì)應(yīng)的是當(dāng)前 Shell 腳本程序的名稱
- $#對(duì)應(yīng)的是總共有幾個(gè)參數(shù)
- $*對(duì)應(yīng)的是所有位置的參數(shù)值
- $?對(duì)應(yīng)的是顯示上一次命令的執(zhí)行返回值
- $1、$2、$3……則分別對(duì)應(yīng)著第 N 個(gè)位置的參數(shù)值
如:
vim example.sh
#!/bin/bash
echo "當(dāng)前腳本名稱為$0"
echo "總共有$#個(gè)參數(shù),分別是$*。 "
echo "第 1 個(gè)參數(shù)為$1,第 5 個(gè)為$5。 "
sh example.sh one two three four five six

3. 判斷用戶的參數(shù)

按照測(cè)試對(duì)象來劃分,條件測(cè)試語句可以分為 4 種:
1. 文件測(cè)試語句
文件測(cè)試所用的參數(shù)
| 運(yùn)算符 | 作用 |
|---|---|
-d |
測(cè)試文件是否為目錄類型 |
-e |
測(cè)試文件是否存在 |
-f |
判斷是否為一般文件 |
-r |
測(cè)試當(dāng)前用戶是否有權(quán)限讀取 |
-w |
測(cè)試當(dāng)前用戶是否有權(quán)限寫入 |
-x |
測(cè)試當(dāng)前用戶是否有權(quán)限執(zhí)行 |
如:
- 判斷/etc/fstab 是否為一個(gè)目錄類型的文件,然后通過 Shell 解釋器的內(nèi)設(shè)$?變量顯示上一條命令執(zhí)行后的返回值。如果返回值為 0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在
[ -d /etc/fstab ]
echo $?

- 判斷/etc/fstab 是否為一般文件,如果返回值為 0,則代表文件存
在,且為一般文件
[ -f /etc/fstab ]
echo $?

2. 邏輯測(cè)試語句
-
&&表示當(dāng)前面的命令執(zhí)行成功后才會(huì)執(zhí)行它后面的命令 -
||表示當(dāng)前面的命令執(zhí)行失敗后才會(huì)執(zhí)行它后面的命令 -
!表示把條件測(cè)試中的判斷結(jié)果取相反值
如:
- 判斷當(dāng)前登錄的用戶是否為非管理員用戶
[ ! $USER = root ] && echo "user" || echo "root"
3. 整數(shù)值比較語句
可用的整數(shù)比較運(yùn)算符
| 運(yùn)算符 | 作用 |
|---|---|
-eq |
是否等于 |
-ne |
是否不等于 |
-gt |
是否大于 |
-lt |
是否小于 |
-le |
是否等于或小于 |
-ge |
是否大于或等于 |
如:
- 10 是否大于 10
[ 10 -gt 10 ]
echo $?

- 獲取內(nèi)存可用量
free -m
free -m | grep Mem:
free -m | grep Mem: | awk '{print $4}'
FreeMem=`free -m | grep Mem: | awk '{print $4}'`
echo $FreeMem

使用整數(shù)運(yùn)算符來判斷內(nèi)存可用量的值是否小于 1024,若小
于則會(huì)提示“Insufficient Memory”(內(nèi)存不足)的字樣
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
4. 字符串比較語句
- 判斷測(cè)試字符串是否為空值,或兩個(gè)字符串是否相同
- 用來判斷某個(gè)變量是否未被定義(即內(nèi)容為空值)
常見的字符串比較運(yùn)算符
| 運(yùn)算符 | 作用 |
|---|---|
| = | 比較字符串內(nèi)容是否相同 |
| != | 比較字符串內(nèi)容是否不同 |
| -z | 判斷字符串內(nèi)容是否為空 |
如:
- 判斷 String 變量是否為空值,進(jìn)而判斷是否定義了這個(gè)變量
[ -z $String]
echo $?

- 環(huán)境變量值 LANG 不是英語(en.US)時(shí),則會(huì)滿足邏輯測(cè)試條件并輸出“Not en.US”(非英語)的字樣
[ $LANG!="en.US" ] && echo "Not en.US"

六、流程控制語句
1. if 條件測(cè)試語句
單分支的 if 語句
if 條件語句的單分支結(jié)構(gòu)由 if、 then、 fi 關(guān)鍵詞組成,而且只在條件成立后才執(zhí)行預(yù)設(shè)的命令,相當(dāng)于口語的“如果……那么……”

如:
- 單分支的 if 條件語句來判斷/media/cdrom 文件是否存在,若存在就結(jié)束條件判斷和整個(gè) Shell 腳本,反之則去創(chuàng)建這個(gè)目錄
vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
雙分支的 if 語句
if 條件語句的雙分支結(jié)構(gòu)由 if、 then、 else、 fi 關(guān)鍵詞組成,它進(jìn)行一次條件匹配判斷,如果與條件匹配,則去執(zhí)行相應(yīng)的預(yù)設(shè)命令;反之則去執(zhí)行不匹配時(shí)的預(yù)設(shè)命令,相當(dāng)于口語的“如果……那么……或者……那么……”

如:
- 驗(yàn)證某臺(tái)主機(jī)是否在線
vim 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
sh chkhost.sh 192.168.10.10

多分支的 if 語句
if 條件語句的多分支結(jié)構(gòu)由 if、 then、 else、 elif、 fi 關(guān)鍵詞組成,它進(jìn)行多次條件匹配判斷,這多次判斷中的任何一項(xiàng)在匹配成功后都會(huì)執(zhí)行相應(yīng)的預(yù)設(shè)命令,相當(dāng)于口語的“如果……那么……如果……那么……”

如:
多分支的 if 條件語句來判斷用戶輸入的分?jǐn)?shù)在哪個(gè)成績(jī)區(qū)間內(nèi),然后輸出如Error、Excellent、 Pass、 Fail 等提示信息
vim chkscore.sh
#!/bin/bash
read -p "Enter your score(0-100): " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ] ; then
echo "$GRADE is Error"
else
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
fi
sh chkscore.sh
提示:
- 在 Linux 系統(tǒng)中, read 是用來讀取用戶輸入信息的命令,能夠把接收到的用戶輸入信息賦值給后面的指定變量, -p 參數(shù)用于向用戶顯示一定的提示信息
2. for 條件循環(huán)語句
for 循環(huán)語句允許腳本一次性讀取多個(gè)信息,然后逐一對(duì)信息進(jìn)行操作處理,當(dāng)要處理的數(shù)據(jù)有范圍時(shí),使用 for 循環(huán)語句再適合不過了

如:
1.使用 for 循環(huán)語句從列表文件中讀取多個(gè)用戶名,然后為其逐一創(chuàng)建用戶賬戶并設(shè)置密碼
- 用戶列表
vim users.txt
andy
barry
carl
duke
eric
george
- 腳本
vim Example.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 "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
提示:
- 執(zhí)行批量創(chuàng)建用戶的 Shell 腳本 Example.sh,在輸入為賬戶設(shè)定的密碼后將由腳本自動(dòng)檢查并創(chuàng)建這些賬戶。由于已經(jīng)將多余的信息通過輸出重定向符轉(zhuǎn)移到了/dev/null 黑洞文件中,因此在正常情況下屏幕窗口除了“用戶賬戶創(chuàng)建成功”(Create success)的提示后不會(huì)有其他內(nèi)容
- 在 Linux 系統(tǒng)中, /etc/passwd 是用來保存用戶賬戶信息的文件。如果想確認(rèn)這個(gè)腳本是否成功創(chuàng)建了用戶賬戶,可以打開這個(gè)文件,看其中是否有這些新創(chuàng)建用戶信息
- 從文本中自動(dòng)讀取主機(jī)列表,然后自動(dòng)逐個(gè)測(cè)試這些主機(jī)是否在線
vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12
vim CheckHosts.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /d
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
3. while 條件循環(huán)語句
while 條件循環(huán)語句是一種讓腳本根據(jù)某些條件來重復(fù)執(zhí)行命令的語句,它的循環(huán)結(jié)構(gòu)往往在執(zhí)行前并不確定最終執(zhí)行的次數(shù),完全不同于 for 循環(huán)語句中有目標(biāo)、有范圍的使用場(chǎng)景。 while 循環(huán)語句通過判斷條件測(cè)試的真假來決定是否繼續(xù)執(zhí)行命令,若條件為真就繼續(xù)執(zhí)行,為假就結(jié)束循環(huán)

如:
- 猜測(cè)數(shù)值大小
vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品實(shí)際價(jià)格為 0-999 之間,猜猜看是多少? "
while true
do
read -p "請(qǐng)輸入您猜測(cè)的價(jià)格數(shù)目: " INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答對(duì)了,實(shí)際價(jià)格是 $PRICE"
echo "您總共猜 g $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了! "
else
echo "太低了! "
fi
done
4. case 條件測(cè)試語句
case 語句是在多個(gè)范圍內(nèi)匹配數(shù)據(jù),若匹配成功則執(zhí)行相關(guān)命令并結(jié)束整個(gè)條件測(cè)試;而如果數(shù)據(jù)不在所列出的范圍內(nèi),則會(huì)去執(zhí)行星號(hào)(*)中所定義的默認(rèn)命令

vim Checkkeys.sh
#!/bin/bash
read -p "請(qǐng)輸入一個(gè)字符,并按 Enter 鍵確認(rèn): " KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您輸入的是 字母。 "
;;
[0-9])
echo "您輸入的是 數(shù)字。 "
;;
*)
echo "您輸入的是 空格、功能鍵或其他控制字符。 "
esac
七、計(jì)劃任務(wù)服務(wù)程序
計(jì)劃任務(wù)分為一次性計(jì)劃任務(wù)與長期性計(jì)劃任務(wù)
一次性計(jì)劃任務(wù)-at
- 一次性計(jì)劃任務(wù)只執(zhí)行一次,一般用于滿足臨時(shí)的工作需求
提示:
- 可以用 at命令實(shí)現(xiàn)這種功能
at [時(shí)間]- 如果想要查看已設(shè)置好但還未執(zhí)行的一次性計(jì)劃任務(wù)
at -l- 要想將其刪除
atrm [任務(wù)序號(hào)]- 在使用 at 命令來設(shè)置一次性計(jì)劃任務(wù)時(shí),默認(rèn)采用的是交互式方法
- Ctrl + D組合鍵來結(jié)束編寫計(jì)劃任務(wù)
at 23:30
systemctl restart httpd
at -l
atrm 1
at -l
或
echo "systemctl restart httpd" | at 23:30
at -l
atrm 1
at -l

長期性計(jì)劃任務(wù)-crondtab
提示:
- 創(chuàng)建、編輯計(jì)劃任務(wù)的命令為
crontab -e- 查看當(dāng)前計(jì)劃任務(wù)的命令為
crontab -l- 刪除某條計(jì)劃任務(wù)的命令為
crontab -r- 如果您是以管理員的身份登錄的系統(tǒng)
crontab -u
來編輯他人的計(jì)劃任務(wù)
分、時(shí)、日、月、星期

| 字段 | 說明 |
|---|---|
| 分 | 取值為 0~59 的整數(shù) |
| 時(shí) | 取值為 0~23 的任意整數(shù) |
| 日 | 取值為 1~31 的任意整數(shù) |
| 月 | 取值為 1~12 的任意整數(shù) |
| 星期 | 取值為 0~7 的任意整數(shù),其中 0 與 7 均為星期日 |
| 命令 | 要執(zhí)行的命令或程序腳本 |
如:
- 在每周一、三、五的凌晨 3 點(diǎn) 25 分,都需要使用 tar 命令把某個(gè)網(wǎng)站的數(shù)據(jù)目錄進(jìn)行打包處理,使其作為一個(gè)備份文件
crontab -e
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
crontab -l

- 每周一至周五的凌晨 1 點(diǎn)鐘自動(dòng)清空/tmp 目錄內(nèi)的所有文件
crontab -e
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
crontab -l
說明:
- 除了用逗號(hào)(,)來分別表示多個(gè)時(shí)間段,例如“8,9,12”表示 8 月、 9 月
和 12 月。還可以用減號(hào)(-)來表示一段連續(xù)的時(shí)間周期(例如字段“日”的取值為“12-15”,則表示每月的 12~15 日)。以及用除號(hào)(/)表示執(zhí)行任務(wù)的間隔時(shí)間(例如“*/2”表示每隔2 分鐘執(zhí)行一次任務(wù))- 在 crond 服務(wù)的配置參數(shù)中,可以像 Shell 腳本那樣以#號(hào)開頭寫上注釋信息,這樣在日后回顧這段命令代碼時(shí)可以快速了解其功能、需求以及編寫人員等要信息
- 計(jì)劃任務(wù)中的“分”字段必須有數(shù)值,絕對(duì)不能為空或是號(hào),而“日”和“星期”字段不能同時(shí)使用,否則就會(huì)發(fā)生沖突
- 在 crond 服務(wù)的計(jì)劃任務(wù)參數(shù)中,所有命令一定要用絕對(duì)路徑的方式來寫,可以用type或whereis查看
更新中......

