關(guān)于Linux中shell 等知識的一些筆記(關(guān)于Linux中卸載分區(qū),下面描述正確的是)

      網(wǎng)友投稿 979 2025-04-02

      寫在前面


      筆記是上課后整理的筆記,適合溫習(xí),不適合新手,希望對小伙伴有幫助

      筆記內(nèi)容包括:Shell一些常見情境

      傍晚時分,你坐在屋檐下,看著天慢慢地黑下去,心里寂寞而凄涼,感到自己的生命被剝奪了。當(dāng)時我是個年輕人,但我害怕這樣生活下去,衰老下去。在我看來,這是比死亡更可怕的事。--------王小波

      一、Shell 基礎(chǔ)知識

      1.1 什么是 Shell

      shell 是用戶 與 linux 內(nèi)核之間的解釋器

      區(qū)分 shell 和 bash:shell是解釋器的總稱,bash是一類解釋器。

      Bash基本特性

      查看當(dāng)前在使用得解釋器,不會顯示臨時切換的解釋器,查看當(dāng)前系統(tǒng)支持得解釋器類型

      [root@liruilong ~]$ echo $SHELL #查看當(dāng)前在使用得解釋器,不會顯示臨時切換的解釋器 /bin/bash [root@liruilong ~]$ cat /etc/shells #查看當(dāng)前系統(tǒng)支持得解釋器類型 /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh

      臨時使用其他的解釋器,查看設(shè)置用戶得解釋器類型

      [root@liruilong ~]$ sh #臨時使用其他的解釋器 [root@liruilong ~]$ useradd zhangsan #創(chuàng)建用戶 [root@liruilong ~]$ cat /etc/passwd | grep zhangsan #查看用戶得解釋器類型 zhangsan:x:1002:1002::/home/zhangsan:/bin/bash [root@liruilong ~]$ usermod -s /bin/tcsh zhangsan #修改zhangsan得解釋器 [root@liruilong ~]$ cat /etc/passwd | grep zhangsan zhangsan:x:1002:1002::/home/zhangsan:/bin/tcsh [root@liruilong ~]$ su - zhangsan #切換用戶,驗證用戶得解釋器類型 [zhangsan@liruilong ~]$ echo $SHELL /bin/tcsh [zhangsan@liruilong ~]$

      Bash的優(yōu)點

      快捷鍵、Tab鍵補齊

      Ctrl + A?#將光標(biāo)移動到命令行首

      Ctrl + E?#將光標(biāo)移動到命令行尾

      Ctrl + C?#中斷正在執(zhí)行的命令

      Ctrl + L?#清屏

      Ctrl + W?#從光標(biāo)位置,往回刪一個單詞

      Ctrl + U?#從光標(biāo)位置,往回刪到開頭

      命令歷史 ( history )

      [root@liruilong ~]$ history #查看歷史記錄 [root@liruilong ~]$ history -c #清空歷史記錄 [root@liruilong ~]$ vim /etc/profile #修改歷史記錄的數(shù)量 46 HISTSIZE=1000

      命令別名 (alias)

      [root@liruilong ~]$ alias #查看當(dāng)前用戶可以使用的別名

      [root@liruilong ~]$ vim /root/.bashrc #重開一個終端生效,針對root用戶生效 alias ens33='cat /etc/sysconfig/network-scripts/ifcfg-ens33' [root@liruilong ~]$ vim /etc/bashrc #重開一個終端生效,針對所有用戶生效 alias ens33='cat /etc/sysconfig/network-scripts/ifcfg-ens33'

      正確輸出重定向覆蓋,> 等同于 1>

      ##正確輸出重定向覆蓋,> 等同于 1> [root@liruilong ~]$ ls /etc/passwd > /root/1.txt [root@liruilong ~]$ cat /root/1.txt /etc/passwd

      正確輸出重定向追加, 1>> 等同于 1>>

      ##正確輸出重定向追加, 1>> 等同于 1>> [root@liruilong ~]$ ls /etc/passwd >> /root/1.txt [root@liruilong ~]$ cat /root/1.txt /etc/passwd /etc/passwd

      錯誤輸出重定向覆蓋追加

      ##錯誤輸出重定向覆蓋 [root@liruilong ~]$ ls --helps 2> /root/2.txt [root@liruilong ~]$ cat /root/2.txt ls:無法識別的選項“--helps” Try 'ls --help' for more information. ##錯誤輸出重定向追加 [root@liruilong ~]$ ls --helps 2>> /root/2.txt [root@liruilong ~]$ cat 2.txt ls:無法識別的選項“--helps” Try 'ls --help' for more information. ls:無法識別的選項“--helps” Try 'ls --help' for more information.

      錯誤或正確的輸出重定向覆蓋追加

      ##錯誤或正確的輸出重定向覆蓋 [root@liruilong ~]$ ls /etc/shadow /root/fsdfs &> /root/3.txt [root@liruilong ~]$ cat /root/3.txt ls: 無法訪問/root/fsdfs: 沒有那個文件或目錄 ##錯誤或正確的輸出重定向追加 [root@liruilong ~]$ ls /etc/shadow /root/fsdfs &>> /root/3.txt [root@liruilong ~]$ cat /root/3.txt ls: 無法訪問/root/fsdfs: 沒有那個文件或目錄 /etc/shadow [root@liruilong ~]$ cat /root/3.txt ls: 無法訪問/root/fsdfs: 沒有那個文件或目錄 /etc/shadow

      ##管道的應(yīng)用 [root@liruilong ~]$ cat /etc/passwd | less [root@liruilong ~]$ echo "123" | passwd --stdin zhangsan

      Shell 執(zhí)行命令的方式

      交互式 (命令行)

      人工干預(yù)

      逐條解釋執(zhí)行、效率低

      非交換式(腳本)

      需要提前設(shè)計

      批量執(zhí)行、效率高

      修改用戶的 Shell 解釋器:/etc/shadow

      二、腳本設(shè)計與運行

      2.1 編寫Shell 腳本

      第一個 Shell 腳本

      [root@liruilong ~]$ mkdir -p /root/shell/day01 [root@liruilong ~]$ vim /root/shell/day01/first.sh echo "Hello World"

      規(guī)范腳本的構(gòu)成

      [root@liruilong ~]$ vim /root/shell/day01/first.sh #!/bin/bash #A test program for Shell. echo "Hello World"

      2.2 執(zhí)行 Shell 腳本

      [root@liruilong ~]$ chmod +x /root/shell/day01/first.sh #賦予執(zhí)行權(quán)限 [root@liruilong ~]$ /root/shell/day01/first.sh #以絕對路徑的方式運行腳本 Hello World [root@liruilong ~]$ cd /root/shell/day01 [root@liruilong day01]# ./first.sh #以相對路徑運行腳本,【.】只得是當(dāng)前目錄 Hello World

      [root@liruilong ~]$ chmod -x /root/shell/day01/first.sh #取消腳本的執(zhí)行權(quán)限 [root@liruilong ~]$ ls -l /root/shell/day01/first.sh -rw-r--r-- 1 root root 58 7月 4 11:03 /root/shell/day01/first.sh [root@liruilong ~]$ sh /root/shell/day01/first.sh #用開啟子進(jìn)程的方式運行腳本 Hello World

      [root@liruilong ~]$ source /root/shell/day01/first.sh #運行腳本時不會開啟子進(jìn)程 Hello World

      #!/bin/bash echo "Hello World" sleep 100 #休眠100秒 [root@liruilong ~]$ yum -y install psmisc #pstree的軟件包 [root@liruilong ~]$ sh /root/hello.sh #終端A上運行腳本 [root@liruilong ~]$ pstree #終端B驗證,查看進(jìn)程樹 ├─sshd─┬─sshd───bash───sh───sleep └─sshd───bash───pstree [root@liruilong ~]$ source /root/hello.sh #終端A上運行腳本 [root@liruilong ~]$ pstree #終端B驗證,查看進(jìn)程樹 ├─sshd─┬─sshd───bash───sleep └─sshd───bash───pstree

      三、變量

      3.1 自定義變量

      以固定的名稱,存放可以能有變化的值

      定義變量的格式:變量名=變量值

      取消變量的格式:unset 變量名

      查看變量的語法格式:?$變量名?${變量名}

      ###腳本中得變量并不需要回收,運行完成后系統(tǒng)會自動回收變量 [root@liruilong ~]$ x=12 #給變量x賦值為12 [root@liruilong ~]$ var1=centos #給變量var1賦值為centos [root@liruilong ~]$ _a=12 #變量名以下劃線開頭 [root@liruilong ~]$ a_0="hello world" #變量的值可以是字符串 [root@liruilong ~]$ echo $x #輸出變量x的值 12 [root@liruilong ~]$ echo $_a #輸出變量$_a的值 12 [root@liruilong ~]$ echo $a_0 #輸出變量$_0的值 hello world [root@liruilong ~]$ echo ${var1}6.5 #輸出變量 var1的值,為了區(qū)分,用{var1}表示 centos6.5 [root@liruilong ~]$ unset x #取消定義的變量x [root@liruilong ~]$ echo $x #再次輸出結(jié)果為空

      3.2系統(tǒng)預(yù)設(shè)變量

      [root@liruilong ~]$ echo $PATH #默認(rèn)搜索路徑 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@liruilong ~]$ echo $UID #當(dāng)前用戶對應(yīng)得UID號 0 [root@liruilong ~]$ echo $USER #當(dāng)前系統(tǒng)得登錄用戶 root [root@liruilong ~]$ echo $HOME #當(dāng)前登錄用戶得家目錄 /root [root@liruilong ~]$ cd /etc/sysconfig/network-scripts/ [root@liruilong network-scripts]# echo $PWD #顯示當(dāng)前用戶得所在路徑 /etc/sysconfig/network-scripts [root@liruilong ~]$ [root@liruilong ~]$ echo $SHELL #顯示當(dāng)前用戶使用得解釋器 /bin/bash

      [root@liruilong ~]$ vim /root/shell/day01/user.sh #!/bin/bash #test positional parameters. echo echo echo [root@liruilong ~]$ bash /root/shell/day01/user.sh aa 99 cc aa 99 cc

      通過位置變量創(chuàng)建系統(tǒng)賬戶,配置密碼

      [root@liruilong ~]$ vim /root/shell/day01/user02.sh #!/bin/bash #read username and pass from positional parameters. useradd "" #創(chuàng)建用戶 echo "" | passwd --stdin "" #給用戶設(shè)置密碼 [root@liruilong ~]$ sh /root/shell/day01/user02.sh tom 123 更改用戶 tom 的密碼 。 passwd:所有的身份驗證令牌已經(jīng)成功更新。

      [root@liruilong ~]$ ls /tmp/ [root@liruilong ~]$ echo $? #返回上一條命令的執(zhí)行狀態(tài):0 為正確,非0 為錯誤 0 [root@liruilong ~]$ cat /root/sfsfsd cat: /root/sfsfsd: 沒有那個文件或目錄 [root@liruilong ~]$ echo $? #上一條命令執(zhí)行失敗,返回一個非0值 1 [root@liruilong ~]$ vim /root/shell/day01/pre.sh #!/bin/bash echo

      [root@liruilong ~]$ ls /tmp/ [root@liruilong ~]$ echo $? #返回上一條命令的執(zhí)行狀態(tài):0 為正確,非0 為錯誤 0 [root@liruilong ~]$ cat /root/sfsfsd cat: /root/sfsfsd: 沒有那個文件或目錄 [root@liruilong ~]$ echo $? #上一條命令執(zhí)行失敗,返回一個非0值 1 [root@liruilong ~]$ vim /root/shell/day01/pre.sh #!/bin/bash echo $0 #輸出當(dāng)前得腳本名 echo $* #輸出所有得位置變量 echo $# #輸出位置變量得數(shù)量 echo $$ #輸出腳本的進(jìn)程號,每次運行腳本進(jìn)程號不同 [root@liruilong ~]$ bash /root/shell/day01/pre.sh aa bb 88 qq /root/shell/day01/pre.sh # $0執(zhí)行結(jié)果 aa bb 88 qq # $*執(zhí)行結(jié)果 4 # $#執(zhí)行結(jié)果 3255 # $$腳本進(jìn)程號 [root@liruilong ~]$

      #輸出當(dāng)前得腳本名 echo $* #輸出所有得位置變量 echo $# #輸出位置變量得數(shù)量 echo $$ #輸出腳本的進(jìn)程號,每次運行腳本進(jìn)程號不同 [root@liruilong ~]$ bash /root/shell/day01/pre.sh aa bb 88 qq /root/shell/day01/pre.sh #

      [root@liruilong ~]$ ls /tmp/ [root@liruilong ~]$ echo $? #返回上一條命令的執(zhí)行狀態(tài):0 為正確,非0 為錯誤 0 [root@liruilong ~]$ cat /root/sfsfsd cat: /root/sfsfsd: 沒有那個文件或目錄 [root@liruilong ~]$ echo $? #上一條命令執(zhí)行失敗,返回一個非0值 1 [root@liruilong ~]$ vim /root/shell/day01/pre.sh #!/bin/bash echo $0 #輸出當(dāng)前得腳本名 echo $* #輸出所有得位置變量 echo $# #輸出位置變量得數(shù)量 echo $$ #輸出腳本的進(jìn)程號,每次運行腳本進(jìn)程號不同 [root@liruilong ~]$ bash /root/shell/day01/pre.sh aa bb 88 qq /root/shell/day01/pre.sh # $0執(zhí)行結(jié)果 aa bb 88 qq # $*執(zhí)行結(jié)果 4 # $#執(zhí)行結(jié)果 3255 # $$腳本進(jìn)程號 [root@liruilong ~]$

      執(zhí)行結(jié)果 aa bb 88 qq # $*執(zhí)行結(jié)果 4 # $#執(zhí)行結(jié)果 3255 # $$腳本進(jìn)程號 [root@liruilong ~]$

      四、變量的擴展應(yīng)用

      4.1 各種引號

      [root@liruilong ~]# touch a b c #創(chuàng)建的是三個文件 [root@liruilong ~]# touch "a b c" #雙引號讓其代表一個文件 [root@liruilong ~]# touch 'b c d' #單引號作用這里是與雙引號相同 [root@liruilong ~]# ls -l #查看 -rw-r--r-- 1 root root 0 7月 6 09:36 a -rw-r--r-- 1 root root 0 7月 6 09:36 b -rw-r--r-- 1 root root 0 7月 6 09:36 c -rw-r--r-- 1 root root 0 7月 6 09:48 a b c -rw-r--r-- 1 root root 0 7月 6 09:48 b c d [root@liruilong ~]# rm -rf "a b c" #刪除時要引號引起來 [root@liruilong ~]# rm -rf 'b c d'

      [root@liruilong ~]# echo $HOME #輸出家目錄路徑 /root [root@liruilong ~]# echo '$HOME' #只輸出 $HOME 字符串,''屏蔽特殊符號的含義 $HOME [root@liruilong ~]# echo '$USER id is $UID' $USER id is $UID [root@liruilong ~]# echo $USER id is $UID root id is 0 [root@liruilong ~]# test=`grep root /etc/shadow` [root@liruilong ~]# test01=$(grep root /etc/shadow) [root@liruilong ~]# echo $test root:$Uebh9/WEzEaQfTb0B6oBgWUTEmYojDW9.6PHOw0.jD7A.SENsHFD/YPwh/L9jRJK0yWAtRF4BEteYZETeMiInp72dTviSKmLZf.:18501:0:99999:7::: dockerroot:!!:18691:::::: [root@liruilong ~]# echo $test01 root:$Uebh9/WEzEaQfTb0B6oBgWUTEmYojDW9.6PHOw0.jD7A.SENsHFD/YPwh/L9jRJK0yWAtRF4BEteYZETeMiInp72dTviSKmLZf.:18501:0:99999:7::: dockerroot:!!:18691:::::: [root@liruilong ~]#

      4.2 read 命令定義變量

      交互式定義變量

      [root@liruilong ~]# read name #交互式定義變量 haha #輸入名字 [root@liruilong ~]# echo $name #查看變量 haha

      [root@liruilong ~]# read -p "請輸入用戶名:" name #交互式定義變量 請輸入用戶名:xixi [root@liruilong ~]# echo $name #查看變量 xixi

      從鍵盤讀取用戶名密碼,創(chuàng)建用戶并設(shè)置密碼

      [root@liruilong ~]# vim /root/shell/day01/user03.sh #!/bin/bash ##read 從鍵盤讀取用戶名密碼,創(chuàng)建用戶并設(shè)置密碼 read -p "請輸入一個用戶名:" name read -p "請輸入密碼:" pass useradd $name echo "$pass" | passwd --stdin $name ##腳本測試 [root@liruilong ~]# source /root/shell/day01/user03.sh 請輸入一個用戶名:nana 請輸入密碼:123456 更改用戶 nana 的密碼 。 passwd:所有的身份驗證令牌已經(jīng)成功更新。

      read 從鍵盤讀取用戶名密碼,創(chuàng)建用戶并設(shè)置密碼,要求不顯示輸入密碼

      [root@liruilong ~]# vim /root/shell/day01/user03.sh #!/bin/bash ##read 從鍵盤讀取用戶名密碼,創(chuàng)建用戶并設(shè)置密碼,要求不顯示輸入密碼 read -p "請輸入一個用戶名:" name read -p "請輸入密碼:" -s pass useradd $name echo "$pass" | passwd --stdin $name ##腳本測試 [root@liruilong ~]# source /root/shell/day01/user03.sh 請輸入一個用戶名:haha 請輸入密碼:更改用戶 haha 的密碼 。 passwd:所有的身份驗證令牌已經(jīng)成功更新。 [root@liruilong ~]# vim /root/shell/day01/user03.sh #!/bin/bash

      不輸入就會自動退出:如果后面不加秒數(shù),則不會自動退出

      ##read 從鍵盤讀取用戶名密碼,創(chuàng)建用戶并設(shè)置密碼,要求不顯示輸入密碼 ##-t 多少秒不輸入就會自動退出:如果后面不加秒數(shù),則不會自動退出 read -p "請輸入一個用戶名:" name read -p "請輸入密碼:" -s -t 3 pass useradd $name echo "$pass" | passwd --stdin $name ##腳本測試 [root@liruilong ~]# source /root/shell/day01/user03.sh 請輸入一個用戶名:lisi 請輸入密碼:更改用戶 lisi 的密碼 。 #超過3秒退出 passwd: 鑒定令牌操作錯誤

      4.3 全局變量 or 局部變量

      ####開啟兩個終端,A和B來測試 #終端A上操作 [root@liruilong ~]# x=11 #定義局部變量 [root@liruilong ~]# sh #進(jìn)入sh子進(jìn)程 sh-4.2# echo $x #無此變量,輸出為空 #終端B上操作 [root@liruilong ~]# pstree #查看進(jìn)程樹 ...... ├─sshd─┬─sshd───bash───sh │ └─sshd───bash───pstree ......

      使用?export?定義全局變量

      #終端A上操作 [root@liruilong ~]# export x=12 #定義全局變量 [root@liruilong ~]# sh #開啟sh子進(jìn)程 sh-4.2# echo $x #新的解釋器里變量也生效 12 sh-4.2# bash #開啟bash子進(jìn)程 [root@liruilong ~]# echo $x #新的解釋器里變量也生效 12 [root@liruilong ~]# pstree #查看進(jìn)程樹 ...... ├─sshd─┬─sshd───bash───sh───bash └─sshd───bash───pstree ......

      五、Shell 中的運算

      5.1 整數(shù)運算

      使用?$[ ]?或?$(( ))?表達(dá)式

      格式:$[整數(shù)1 運算符 整數(shù)2…]

      計算結(jié)果替換表達(dá)式本身,可結(jié)合 echo 命令輸出

      [root@liruilong ~]# echo $[1+2] 3 [root@liruilong ~]# echo $[2*3] 6

      [root@liruilong ~]# x=15;y=3 #定義兩個臨時變量x,y [root@liruilong ~]# echo $[x+y] #加法運算 18 [root@liruilong ~]# echo $[x-y] #減法運算 12 [root@liruilong ~]# echo $[x*y] #乘法運算 45 [root@liruilong ~]# echo $[x/3] #除法運算 5 [root@liruilong ~]# echo $[x%3] #取余運算(除盡) 0 [root@liruilong ~]# echo $[x%2] #取余運算(未除盡) 1 [root@liruilong ~]# x=15;y=3 #定義兩個臨時變量x,y [root@liruilong ~]# echo $((x+y)) #加法運算 18 [root@liruilong ~]# echo $((x-y)) #減法運算 12 [root@liruilong ~]# echo $((x*y)) #乘法運算 45 [root@liruilong ~]# echo $((x/y)) #除法運算 5 [root@liruilong ~]# echo $((x%y)) #取余運算(除盡) 0 [root@liruilong ~]# echo $((x%y)) #取余運算(未除盡) 1 [root@liruilong ~]# x=2 #定義變量x=2 [root@liruilong ~]# echo $[x+=4] #輸出x值,x=x+4 6 [root@liruilong ~]# echo $x #輸出x值 6

      [root@liruilong ~]# echo $[x+=1] #輸出x值,x=x+1 7 [root@liruilong ~]# echo $x #輸出x值 7 [root@liruilong ~]# echo $[x*=3] #輸出x值,x=x*3 21 [root@liruilong ~]# echo $x #輸出x值 21 [root@liruilong ~]# echo $[x++] #輸出x+1前的值 21 [root@liruilong ~]# echo $x #這是x+1后的值 22 [root@liruilong ~]# echo $[x--] #輸出x-1前的值 22 [root@liruilong ~]# echo $x #輸出x-1后的值 21

      ####let 用于指定算術(shù)運算 [root@liruilong ~]# let i=2*3 #將算術(shù)運算 2*3 賦予變量 i [root@liruilong ~]# echo $i 6 [root@liruilong ~]# let i=3*6 #將算術(shù)運算 3*6 賦予變量 i [root@liruilong ~]# echo $i 18 [root@liruilong ~]# b=2 #定義變量 [root@liruilong ~]# let b+=2 #變量賦值,b=b+2 [root@liruilong ~]# echo $b 4 [root@liruilong ~]# let b*=3 #變量賦值,b=b*3 [root@liruilong ~]# echo $b 12 [root@liruilong ~]# x=2 [root@liruilong ~]# let x++;echo $x # ;用來區(qū)分兩條命令 3 [root@liruilong ~]# let x++;echo $x # ;用來區(qū)分兩條命令 4 [root@liruilong ~]# let x+=3;echo $x # ;用來區(qū)分兩條命令 7

      5.2 小數(shù)運算

      Bash 內(nèi)建機制僅支持整數(shù)運算,不支持小數(shù)運算

      [root@liruilong ~]# echo $[12.2+23] -bash: 12.2+23: 語法錯誤: 無效的算術(shù)運算符 (錯誤符號是 ".2+23")

      我們可以通過計算器軟件bc?實現(xiàn)小數(shù)運算

      關(guān)于Linux中shell 等知識的一些筆記(關(guān)于Linux中卸載分區(qū),下面描述正確的是)

      我們沒有該軟件則需要使用yum安裝;?bc支持交換式和非交換式兩種計算,scale=n可以約束小數(shù)位,quit退出交互式計算

      [root@liruilong ~]# yum -y install bc #安裝bc軟件包 ###使用bc進(jìn)行交互運算 [root@liruilong ~]# bc 12+23 #加法運算 35 23.43*1.243 #乘法運算 29.123 23/2 #除法運算 11 23%3 #取余運算 2 quit #退出命令 [root@liruilong ~]# echo "1.2+3.3" | bc 4.5 [root@liruilong ~]# echo "1.2+3.3;3.8*2.7" | bc #同時進(jìn)行多個運算 4.5 10.2 [root@liruilong ~]# echo "scale=2;10/2" |bc #scale=2 結(jié)果小數(shù)位保留兩位 5.00 [root@liruilong ~]# echo "scale=2;17/2" |bc 8.50 [root@liruilong ~]# echo "scale=2;17.34/2" |bc #scale=2 結(jié)果小數(shù)位保留兩位

      bc 支持的比較操作符:>、>=、<、<=、==、!=

      表達(dá)式成立則返回1,否則返回0

      [root@liruilong ~]# echo "1>2" | bc #比較錯誤,1小于2,結(jié)果為0 0 [root@liruilong ~]# echo "5>2" | bc #比較正確,5大于2,結(jié)果為1 1 [root@liruilong ~]# echo "2==2" | bc #比較正確,2等于2,結(jié)果為1 1 [root@liruilong ~]# echo "2!=2" | bc #比較錯誤,2等于2,結(jié)果為0 0 [root@liruilong ~]# echo "12.34 < 8.8" | bc #比較錯誤,12.34 大于 8.8,結(jié)果為0 0 [root@liruilong ~]# echo "12.34 != 8.8" | bc #比較正確,12.34不等于8.8 [root@liruilong ~]# echo "hello world" #echo 默認(rèn)會換行 hello world [root@liruilong ~]# echo -n "hello world" #-n 取消 echo 命令的默認(rèn)換行 hello world [root@liruilong ~]#

      六、綜合案例

      6.1 監(jiān)控腳本之顯示硬件信息

      -n選項:不換行

      -e選項:支持?jǐn)U展屬性

      echo -e “\033[文字顏色m 文字 \033[0m”

      文字顏色:30 ----------- 37

      30:黑 34:藍(lán)色

      31:紅 35:紫色

      32:綠 36:深綠

      33:黃 37:白色

      [root@liruilong ~]# echo -e "\033[32m天氣預(yù)報\033[0m" #0m還原文字顏色,讓顏色只作用 于當(dāng)前字體 hello #32綠色字

      顯示服務(wù)器硬件信息

      ###最小化安裝需要安裝查看IP的軟件包 [root@liruilong ~]# which ifconfig /usr/sbin/ifconfig [root@liruilong ~]# rpm -qf /usr/sbin/ifconfig net-tools-2.0-0.22.20131004git.el7.x86_64 [root@liruilong ~]# vim /root/shell/day01/info.sh #!/bin/bash ##顯示服務(wù)器硬件信息 echo -e "\033[34m----------服務(wù)器硬件信息----------\033[0m" echo -e "\033[32m網(wǎng)卡信息如下:\033[0m" ifconfig ens33 | grep "inet" echo -e "\033[32m剩余內(nèi)容容量信息如下: \033[0m" grep MemAvailable /proc/meminfo echo -e "\033[32m磁盤容量信息如下: \033[0m" df -h / echo -e "\033[32mCPU信息如下:\033[0m" grep "model name" /proc/cpuinfo [root@liruilong ~]# sh /root/shell/day01/info.sh #運行腳本 ----------服務(wù)器硬件信息---------- 網(wǎng)卡信息如下: inet 192.168.4.5 netmask 255.255.255.0 broadcast 192.168.4.255 inet6 fe80::452e:bf37:6ef7:c2fa prefixlen 64 scopeid 0x20 剩余內(nèi)容容量信息如下: MemAvailable: 1238268 kB 磁盤容量信息如下: 文件系統(tǒng) 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 50G 7.2G 43G 15% / CPU信息如下: model name : Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz

      [root@liruilong ~]# vim /root/shell/day01/calc.sh #!/bin/bash ##計算1+2+3,...,+n的和,可以使用n*(n+1)/2公式快速計算結(jié)果 read -p "請輸入一個正整數(shù):" num sum=$[num*(num+1)/2] echo -e "\033[32m$num以內(nèi)整數(shù)的總和是:$sum \033[0m" [root@liruilong ~]# sh /root/shell/day01/calc.sh 請輸入一個正整數(shù):23 23以內(nèi)整數(shù)的總和是:276 [root@liruilong ~]# vim /root/shell/day01/area.sh #!/bin/bash ##使用三角形的底邊和高計算面積:A=1/2底高 read -p "請輸入三角形底邊長度:" bottom read -p "請輸入三角形的高度:" hight A=$(echo "scale=2;1/2*$bottom*$hight" | bc) echo -e "\033[32m三角形的面積是:$A\033[0m" [root@liruilong ~]# sh /root/shell/day01/area.sh 請輸入三角形底邊長度:23 請輸入三角形的高度:5 三角形的面積是:57.50 [root@liruilong ~]# vim /root/shell/day01/tixingmianhi.sh #!/bin/bash ##梯形面積:(上底邊長度+下底邊長度)*高/2 read -p "請輸入梯形上底邊長度:" a read -p "請輸入梯形下底邊長度:" b read -p "請輸入梯形高度:" h A=$(echo "scale=2;($a+$b)*$h/2" | bc) echo -e "\033[32m梯形面積是:$A\033[0m" [root@liruilong ~]# sh -x /root/shell/day01/tixingmianhi.sh #-x執(zhí)行時測試 + read -p 請輸入梯形上底邊長度: a 請輸入梯形上底邊長度:32 + read -p 請輸入梯形下底邊長度: b 請輸入梯形下底邊長度:45 + read -p 請輸入梯形高度: h 請輸入梯形高度:7 ++ echo 'scale=2;(32+45)*7/2' ++ bc + A=269.50 + echo -e '\033[32m梯形面積是:269.50\033[0m' 梯形面積是:269.50 [root@liruilong ~]# vim /root/shell/day01/yuanmianji.sh #!/bin/bash ###使用A=πr2 公式計算圓的面積,取2位小數(shù)點精度,π=3.14 read -p "請輸入圓的半徑:" r A=`echo "scale=2;3.14*$r*2" | bc` echo -e "\033[32m圓的面積是:$A\033[0m" [root@liruilong ~]# sh -x /root/shell/day01/yuanmianji.sh #-x執(zhí)行時測試 + read -p 請輸入圓的半徑: r 請輸入圓的半徑:25 ++ echo 'scale=2;3.14*25*2' ++ bc + A=157.00 + echo -e '\033[32m圓的面積是:157.00\033[0m' 圓的面積是:157.00

      [root@liruilong ~]# vim /root/shell/day01/yum.sh #!/bin/bash ###配置本地yum倉庫 #刪除所有.repo文件 rm -rf /etc/yum.repos.d/* #掛載本地光盤 mkdir /centos mount /dev/cdrom /centos chmod +x /etc/rc.d/rc.local echo "mount /dev/cdrom /centos" >> /etc/rc.d/rc.local #創(chuàng)建yum源配置文件 echo "[Centos] name=centos7.5 baseurl=file:///centos enabled=1 gpgcheck=0" > /etc/yum.repos.d/centos.repo #yum 測試 yum clean all yum repolist

      [root@liruilong ~]# sh -x /root/shell/day01/yum.sh + rm -rf /etc/yum.repos.d/centos.repo + mkdir /centos + mount /dev/cdrom /centos mount: /dev/sr0 寫保護(hù),將以只讀方式掛載 + chmod +x /etc/rc.d/rc.local + echo 'mount /dev/cdrom /centos' + echo '[Centos] name=centos7.5 baseurl=file:///centos enabled=1 gpgcheck=0' + yum clean all + yum repolist

      七、字符串處理與變量初始化

      字符串處理機制

      ┌──(liruilong?Liruilong)-[/mnt/c/Users/lenovo] └─$ name=liruilong ┌──(liruilong?Liruilong)-[/mnt/c/Users/lenovo] └─$ echo $name liruilong ┌──(liruilong?Liruilong)-[/mnt/c/Users/lenovo] └─$ echo ${#name} 9 ┌──(liruilong?Liruilong)-[/mnt/c/Users/lenovo] └─$ echo ${name:0:3} lir ┌──(liruilong?Liruilong)-[/mnt/c/Users/lenovo] └─$ echo ${name:3:3} uil ┌──(liruilong?Liruilong)-[/mnt/c/Users/lenovo] └─$ echo ${name:3:-3} uil

      替換1個結(jié)果:${變量/舊字串/新字串}

      替換全部結(jié)果:${變量//舊字串/新字串}

      子串替換時,變量本身的值并不會變化,只會把變化的值輸出到屏幕

      ###子串替換時,變量本身的值并不會變化,只會把變化的值輸出到屏幕 [root@liruilong ~]# phone=13812345678 [root@liruilong ~]# echo ${phone/3/X} # / 替換變量中的第一個3 1X812345678 [root@liruilong ~]# echo ${phone//3/X} # // 替換變量中所有3 1X812X45678 [root@liruilong ~]# info=$(head -1 /etc/passwd) #定義變量 [root@liruilong ~]# echo $info #查看變量的值 root:x:0:0:root:/root:/bin/bash [root@liruilong ~]# echo ${info/root/ROOT} #替換單個root為大寫 ROOT:x:0:0:root:/root:/bin/bash [root@liruilong ~]# echo ${info//root/ROOT} #替換所有root為大寫 ROOT:x:0:0:ROOT:/ROOT:/bin/bash

      從左向右: 最短匹配刪除:${變量#關(guān)鍵詞}

      從左向左:最長匹配刪除:${變量##關(guān)鍵詞}

      [root@liruilong ~]# A=$(head -1 /etc/passwd) #定義變量 [root@liruilong ~]# echo $A #查看變量的值 root:x:0:0:root:/root:/bin/bash [root@liruilong ~]# echo ${A#*:} #刪除字串A中,第一個 : 前的所有字符 x:0:0:root:/root:/bin/bash [root@liruilong ~]# echo ${A##*:} #刪除字串A中,最后一個 : 前的所有字符 /bin/bash [root@liruilong ~]# echo $A #變量A的值不會發(fā)生變化 root:x:0:0:root:/root:/bin/bash

      從右向左: 最短匹配刪除:${變量%關(guān)鍵詞}

      從右向左:最長匹配刪除:${變量%%關(guān)鍵詞}

      [root@liruilong ~]# A=$(head -1 /etc/passwd) #定義變量 [root@liruilong ~]# echo $A #查看變量的值 root:x:0:0:root:/root:/bin/bash [root@liruilong ~]# echo ${A%:*} #刪除字串A中,最后一個 : 后的所有字符 root:x:0:0:root:/root [root@liruilong ~]# echo ${A%%:*} #刪除字串A中,第一個 : 后的所有字符 root [root@liruilong ~]# echo $A #變量A的值不會發(fā)生變化 root:x:0:0:root:/root:/bin/bash

      批量修改文件擴展名

      [root@liruilong ~]# cd /root/shell/day03/ [root@liruilong day03]# touch {a,b,c,d,e,f}.txt [root@liruilong day03]# vim /root/shell/day03/rename1.sh #!/bin/bash ####批量修改目錄下的以.txt結(jié)尾的文件為.doc結(jié)尾 for i in $(ls *.txt) do mv $i ${i%.*}.doc #通過字符串去尾的去做 done ###腳本驗證 [root@liruilong day03]# sh ./rename1.sh [root@liruilong day03]# ls [root@liruilong day03]# vim /root/shell/day03/rename2.sh #!/bin/bash ###批量修改文件擴展名,$1為原擴展名,$2為新擴展名 for i in $(ls *.$1) do mv $i ${i%.*}.$2 done ###腳本驗證 [root@liruilong day03]# sh ./rename1.sh doc pdf [root@liruilong day03]# ls

      變量初始化::

      [root@liruilong ~]# X=123 [root@liruilong ~]# echo ${X:-xyz} #變量有值,輸出該變量的值 123 [root@liruilong ~]# echo ${ABC:-xyz} #變量無值,輸出該變量的初始值 xyz

      創(chuàng)建系統(tǒng)用戶

      [root@liruilong ~]# vim /root/shell/day03/user03.sh #!/bin/bash ##創(chuàng)建系統(tǒng)用戶,未設(shè)置密碼,會自動賦予用戶初始密碼12345 ###定義函數(shù),輸出文字的顏色 color(){ echo -e "\033[32m$1\033[0m" } read -p "請輸入用戶名:" iname if [ -z "$iname" ];then color "未輸入用戶名,腳本將退出..." exit fi ###輸入密碼,不輸入密碼,則賦予初始密碼123456 read -p "請輸入密碼:" ipass ipass=${ipass:-123456} useradd "$iname" echo "$ipass" | passwd --stdin "$iname" ###測試腳本 [root@liruilong ~]# sh /root/shell/day03/user3.sh 請輸入用戶名: 未輸入用戶名,腳本將退出... [root@liruilong ~]# sh /root/shell/day03/user3.sh 請輸入用戶名:zhang 請輸入密碼: 更改用戶 zhang 的密碼 。 passwd:所有的身份驗證令牌已經(jīng)成功更新。

      一、使用sed修改配置

      1.1 常用sed指令

      1.2 過濾數(shù)據(jù)

      Print 指令

      ##過濾網(wǎng)卡IP地址 [root@liruilong ~]# sed -n '/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-ens33 IPADDR=192.168.4.5 ##過濾內(nèi)存信息 [root@liruilong ~]# free | sed -n '/Mem/p' Mem: 1865280 373344 1072176 10544 419760 1278920 ##過濾磁盤根分區(qū)信息(根分區(qū)是以/ 結(jié)尾的分區(qū)) [root@liruilong ~]# df -h | sed -n '/\/$/p' /dev/mapper/centos-root 50G 3.4G 47G 7% / ##顯示第1、3、6行內(nèi)容 [root@liruilong ~]# sed -n '1p;3p;6p' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync ##打印第2行以外的所有其他行內(nèi)容 [root@liruilong ~]# sed -n '2!p' /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

      1.3 刪除數(shù)據(jù)

      Delete 指令 (不使用-i 選項,源文件不會被修改)

      ##刪除/etc/hosts全文,沒有定位條件等于匹配所有行 [root@liruilong ~]# sed ‘d’ /etc/hosts ##刪除/tmp/fstab 的1到3行 [root@liruilong ~]# cat /etc/fstab > /tmp/fstab [root@liruilong ~]# sed "1,3d" /tmp/fstab [root@liruilong ~]# vim /tmp/fstab ##刪除不包含dev的行 [root@liruilong ~]# sed '/dev/!d' /tmp/fstab ##刪除所有以 # 符號開頭的行 [root@liruilong ~]# sed '/^#/d' /tmp/fstab ##刪除空白行 [root@liruilong ~]# sed '/^$/d' /tmp/fstab

      1.4 替換行

      Replace 指令(不使用 -i 選項,源文件不會被修改)

      ##所有行替換為 123456 [root@liruilong ~]# sed 'c 123456' /tmp/fstab 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456 ##替換IP地址為 1.1.1.1 [root@liruilong ~]# file=/etc/sysconfig/network-scripts/ifcfg-ens33 [root@liruilong ~]# sed '/IPADDR/c IPADDR=1.1.1.1' $file TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=314ef20c-394e-4ef6-ba3b-0c6aaf47d1fc DEVICE=ens33 ONBOOT=yes IPADDR=1.1.1.1 PREFIX=24 ##替換/etc/hosts中包含127的行為 127.0.0.1 [root@liruilong ~]# cat /etc/hosts [root@liruilong ~]# sed '/127/c 127.0.0.1' /etc/hosts 127.0.0.1 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ##替換文件的第四行為 xxxx [root@liruilong ~]# sed '4c xxxx' /etc/shells /bin/sh /bin/bash /sbin/nologin xxxx /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh

      1.5 替換關(guān)鍵詞

      Substitution指令(不使用 -i 選項,源文件不會被修改)

      ##通過echo命令定義測試文件 [root@liruilong ~]# echo "2046 2048 2046 2046 > 1001 2046 2999 1888 > 2046 2046 2046 2046" > test.txt

      ##查看測試文件的內(nèi)容 [root@liruilong ~]# cat test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 ##把每一行的第一個2046替換為xxxx [root@liruilong ~]# sed 's/2046/xxxx/' test.txt xxxx 2048 2046 2046 1001 xxxx 2999 1888 xxxx 2046 2046 2046 ##把每行中的所有的2046替換為xxxx [root@liruilong ~]# sed 's/2046/xxxx/g' test.txt xxxx 2048 xxxx xxxx 1001 xxxx 2999 1888 xxxx xxxx xxxx xxxx ##把每行中的第2個2046替換為xxxx [root@liruilong ~]# sed 's/2046/xxxx/2' test.txt 2046 2048 xxxx 2046 1001 2046 2999 1888 2046 xxxx 2046 2046 ##把每行中的所有2046替換為(2046); &就代表被替換的參數(shù) [root@liruilong ~]# sed 's/2046/(&)/g' test.txt (2046) 2048 (2046) (2046) 1001 (2046) 2999 1888 (2046) (2046) (2046) (2046) ##把每行中的所有2046替換為2046-1111;&就代表被替換的參數(shù) [root@liruilong ~]# sed 's/2046/&-1111/' test.txt 2046-1111 2048 2046 2046 1001 2046-1111 2999 1888 2046-1111 2046 2046 2046 ##把第2行中的所有2046替換為xxxx [root@liruilong ~]# sed '2s/2046/xxxx/g' test.txt 2046 2048 2046 2046 1001 xxxx 2999 1888 2046 2046 2046 2046 ##把第2行中的所有2046替換為空,等同于刪除操作 [root@liruilong ~]# sed '2s/2046//g' test.txt 2046 2048 2046 2046 1001 2999 1888 2046 2046 2046 2046 ##只輸出修改過的行 [root@liruilong ~]# sed -n '2s/2046/xxxx/p' test.txt 1001 xxxx 2999 1888

      正則符號() 具有保留的功能

      [root@liruilong ~]# echo "hello the world" | sed -r 's/^(.)(.*)(.)$/\3\2\1/' dello the worlh [root@liruilong ~]# echo "hello the world" | sed -r 's/^(.)(.*)(.)$/\3\1\2/' dhello the worl [root@liruilong ~]# echo "hello the world" | sed -r 's/^(.)(.*)(.)$/\3\3/' dd [root@liruilong ~]# echo "hello the world" | sed -r 's/^(.)(.*)(.)$/\3\3\2\1\1/' ddello the worlhh

      1.8 打印行號

      ##打印第2行的行號 [root@liruilong ~]# sed -n '2=' /etc/passwd 2 ##打印包含root的行號 [root@liruilong ~]# sed -n '/root/=' /etc/passwd 1 10 ##打印bash結(jié)尾的行的行號 [root@liruilong ~]# sed -n '/bash$/=' /etc/passwd 1 42 ##$代表最后一行,打印最后一行的行號 [root@liruilong ~]# sed -n '$=' /etc/passwd 42

      二、sed 多行文本處理

      2.1 文本塊指令

      i (insert): 插入

      a (append): 追加

      r (read): 讀 取文件 | 導(dǎo)入文件內(nèi)容

      w (write): 文件另存為 | 導(dǎo)出文件內(nèi)容

      插入指令 Insert (插入,行前寫入)

      ##查看test.txt文件內(nèi)容 [root@liruilong ~]# cat test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 ##在第2行前插入 ABC_XYZ [root@liruilong ~]# sed '2i ABC_XYZ' test.txt 2046 2048 2046 2046 ABC_XYZ 1001 2046 2999 1888 2046 2046 2046 2046 ##在第3 行前插入 ABC_XYZ [root@liruilong ~]# sed '3i ABC_XYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 ABC_XYZ 2046 2046 2046 2046 ##在包含 2046的行前插入兩行數(shù)據(jù)ABC\nXYZ,\n是換行符 [root@liruilong ~]# sed '/2046/i ABC\nXYZ' test.txt ABC XYZ 2046 2048 2046 2046 ABC XYZ 1001 2046 2999 1888 ABC XYZ 2046 2046 2046 2046 ##在包含 1888 的行前插入兩行數(shù)據(jù)ABC\nXYZ,\n是換行符 [root@liruilong ~]# sed '/1888/i ABC\nXYZ' test.txt 2046 2048 2046 2046 ABC XYZ 1001 2046 2999 1888 2046 2046 2046 2046

      Append(追加,行后寫入)

      ##在第2行后面插入 ABC_XYZ [root@liruilong ~]# sed '2a ABC_XYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 ABC_XYZ 2046 2046 2046 2046 ##在第3行后面插入 ABC_XYZ [root@liruilong ~]# sed '3a ABC_XYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 ABC_XYZ ##在包含 2046的行后面插入兩行數(shù)據(jù)ABC\nXYZ,\n是換行符 [root@liruilong ~]# sed '/2046/a ABC\nXYZ' test.txt 2046 2048 2046 2046 ABC XYZ 1001 2046 2999 1888 ABC XYZ 2046 2046 2046 2046 ABC XYZ ##在包含 1888 的行后面插入兩行數(shù)據(jù)ABC\nXYZ,\n是換行符 [root@liruilong ~]# sed '/1888/a ABC\nXYZ' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 ABC XYZ 2046 2046 2046 2046

      導(dǎo)入指令:Read (將其他文件的內(nèi)容導(dǎo)入)

      ##將/etc/hosts中的內(nèi)容讀入到 test.txt 文件第2行的后面 [root@liruilong ~]# sed '2r /etc/hosts' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 2046 2046 2046 2046 ##將/etc/hosts中的內(nèi)容讀入到 test.txt 文件每一行數(shù)據(jù)的后面 [root@liruilong ~]# sed 'r /etc/hosts' test.txt 2046 2048 2046 2046 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 1001 2046 2999 1888 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 2046 2046 2046 2046 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ##將/etc/hosts中的內(nèi)容讀入到 test.txt 文件中包含 1888字串所在行的后面 [root@liruilong ~]# sed '/1888/r /etc/hosts' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 2046 2046 2046 2046

      導(dǎo)出指令:Write (將文件內(nèi)容導(dǎo)出另存到其他文件)

      ##將test.txt 文件的所有內(nèi)容另存為一個新文件 copy_test.txt [root@liruilong ~]# sed 'w copy_test.txt' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 [root@liruilong ~]# cat copy_test.txt #查看文件的內(nèi)容 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 ##將test.txt 文件的 2到3行另存為新文件line.txt [root@liruilong ~]# sed '2,3w line.txt' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 [root@liruilong ~]# cat line.txt #查看新文件的內(nèi)容 1001 2046 2999 1888 2046 2046 2046 2046 ##將test.txt 文件中所有包含1888的行另存為新文件 1888.txt [root@liruilong ~]# sed '/1888/w /opt/1888.txt' test.txt 2046 2048 2046 2046 1001 2046 2999 1888 2046 2046 2046 2046 [root@liruilong ~]# cat /opt/1888.txt #查看文件的內(nèi)容 1001 2046 2999 1888

      三、sed綜合案例

      點名器

      一、awk基礎(chǔ)語法

      awk 編程語言/數(shù)據(jù)處理引擎

      創(chuàng)造者:Aho、Weinberger、Kernighan

      基于模式匹配檢查輸入文本,逐行處理并輸出

      通常用于在 Shell 腳本中,獲取指定的數(shù)據(jù)

      單獨用時,可對文本數(shù)據(jù)做統(tǒng)計

      awk 流程控制

      格式1:前置命令| awk [選項] , [條件] (指令)’

      格式2: awk [選項] ’ [條件] {指令}, 文件…

      格式3: awk ,BEGIN{} [條件]{} END{}’ 文件…

      if語句

      單分支if判斷

      awk '{指令}' 文件

      ###if是指令必須放到{ if(){} }中 #如果UID大于等于1000時,i自加1;最后輸出i的值,i作為變量默認(rèn)值為0 [root@liruilong ~]# awk -F: '{if($3>=1000){i++}} END{print i}' /etc/passwd 2 ###當(dāng)$1 用戶名為root時,打印用戶名和UID [root@liruilong ~]# awk -F: '{if($1=="root"){print $1,$3}}' /etc/passwd root 0 ###查看CPU的負(fù)載情況 [root@liruilong ~]# uptime 10:53:35 up 2 min, 1 user, load average: 0.33, 0.33, 0.14 ###當(dāng)cpu 15分鐘的負(fù)載大于0.01時,打印15分鐘的負(fù)載信息 [root@liruilong ~]# uptime | awk '{if($NF>0.01){print "CPUload:",$NF}}' CPUload: 0.13

      雙分支if判斷

      awk '{指令}' 文件

      ####統(tǒng)計普通用戶和系統(tǒng)用戶的個數(shù) ##普通用戶的UID號大于等于1000;系統(tǒng)用戶的UID小于1000 [root@liruilong ~]# awk -F: '{if($3>=1000){i++} else{j++}} END{print "普通用戶:"i,"系統(tǒng)用戶:"j}' /etc/passwd 普通用戶:3 系統(tǒng)用戶:34 [root@liruilong ~]# #### 統(tǒng)計普通文件和目錄的個數(shù) ## 普通文件的屬性以“-”開頭,非“-”開頭的也是目錄也可以是快捷方式 [root@liruilong ~]# ls -l /etc/ | awk '{ if($1~/^-/){x++} else{y++} } END{print "普通文件個數(shù):"x,"目錄個數(shù):"y}' 普通文件個數(shù):122 目錄個數(shù):148

      多分支if判斷

      awk '{指令}' 文件

      ###awk '{ if(){} else if(){} else{} } END{}' [root@liruilong ~]# ls -l /etc/ | awk '{ if($1~/^-/){x++} else if($1~/^d/){y++} else{z++} } END{print "普通文件:"x,"\n目錄個數(shù):",y,"\n其他:",z}' 普通文件:118 目錄個數(shù): 106 其他: 17 [root@liruilong ~]#

      for循環(huán)

      awk 的for 循環(huán)采用與C語言一樣的語法格式:?for(表達(dá)式1;表達(dá)式2;表達(dá)式3) {指令}

      ##i=1,每循環(huán)一次i的值加1 [root@liruilong ~]# awk 'BEGIN{ for(i=1;i<=5;i++) {print i} }' 1 2 3 4 5 ##i=5,每循環(huán)一次i的值減1 [root@liruilong ~]# awk 'BEGIN{ for(i=5;i>=1;i--){print i} }' 5 4 3 2

      awk 數(shù)組與應(yīng)用案例

      awk 數(shù)組的定義及使用

      數(shù)組的下標(biāo)可以是數(shù)字,也可以是字符串

      ###給數(shù)組name添加兩個值,并打印數(shù)值 [root@liruilong ~]# awk 'BEGIN{ > name[0]="jim";name[1]="tom";print name[1],name[0] > }' tom jim ###給數(shù)組name添加兩個值,調(diào)用數(shù)組中的值 [root@liruilong ~]# awk 'BEGIN{ > name[0]="jim";name[1]="tom";print name[1],name[1],name[0] > }' tom tom jim

      定義數(shù)組age,age[tom]的值為22,age[jim]的值為18

      [root@liruilong ~]# awk 'BEGIN{ > age["tom"]=22;age["jim"]=18;print age["tom"],age["jim"] > }' 22 18

      遍歷數(shù)組的值

      ###定義數(shù)組x,賦值,用for循環(huán)取數(shù)組中的值 [root@liruilong ~]# awk 'BEGIN{ x[0]=0;x[1]=11;x[2]=12;x[3]=13;x[4]=14; > for(i in x){print i,x[i]} > }' 4 14 0 0 1 11 2 12 3 13

      應(yīng)用案例

      分組統(tǒng)計

      ###IP為數(shù)組,數(shù)組的下表為access_log 第一列的ip地址; 數(shù)組對應(yīng)的值為 ip地址出現(xiàn)的次數(shù) [root@liruilong ~]# awk '{IP[$1]++} END{ for(i in IP){print i,IP[i]} }' /root/access_log 172.40.1.14 1 172.40.1.1 1 172.40.1.16 4 172.40.1.17 6 172.40.1.18 3

      統(tǒng)計每個系統(tǒng)賬戶登錄的次數(shù)

      [root@liruilong ~]# who | awk '{wh[$1]++} END{for(i in wh){print i,wh[i]} }' root 2 [root@liruilong ~]#

      awk 綜合案例

      ss命令

      [root@liruilong ~]# ss -at State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:webcache *:* LISTEN 0 128 *:ssh *:* LISTEN 0 128 [root@liruilong ~]# ss -atu #查看tcp和udp協(xié)議 #查看tcp和udp協(xié)議,以數(shù)字顯示,端口都變成了數(shù)字模式 [root@liruilong ~]# ss -atun #查看tcp和udp協(xié)議,以數(shù)字顯示,端口都變成了數(shù)字模式,顯示進(jìn)程名和PID號 [root@liruilong ~]# ss -atunp #查看tcp和udp協(xié)議,以數(shù)字顯示,端口都變成了數(shù)字模式,顯示進(jìn)程名和PID號,不顯示標(biāo)題行 [root@liruilong ~]# ss -atunpH [root@liruilong ~]# ss -s ##匯總所有的結(jié)果

      過濾連接狀態(tài)

      [root@liruilong ~]# vim /root/shell/day05/net.sh #!/bin/bash ##所有TCP連接的個數(shù) TCP_Total=$(ss -s | awk '$1=="TCP"{print $2}') ##所有UDP連接的個數(shù) UDP_Total=$(ss -s | awk '$1=="UDP"{print $2}') ##所有處于 Listen 監(jiān)聽狀態(tài)的 TCP 端口個數(shù) TCP_Listen_Total=$(ss -antlpH | awk 'BEGIN{count=0} {count++} END{print count}') ##所有處于 ESTABLISHED 狀態(tài)的TCP連接個數(shù) TCP_Estab_Total=$(ss -antpH | awk 'BEGIN{count=0} /^ESTAB/{count++} END{print count}') ##所有處于 TIME-WAIT 狀態(tài)的 tcp 連接個數(shù) TCP_TIME_WAIT_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT/{count++} END{print count}') ##顯示TCP連接總數(shù) echo "TCP連接總數(shù):$TCP_Total" ##顯示UDP連接總數(shù) echo "UDP連接總數(shù):$UDP_Total" ##顯示處于LISTEN狀態(tài)的TCP端口個數(shù) echo "處于LISTEN狀態(tài)的TCP端口個數(shù):$TCP_Listen_Total" ##顯示處于ESTABLISHED狀態(tài)的TCP連接個數(shù) echo "處于ESTAB狀態(tài)的TCP連接個數(shù):$TCP_Estab_Total" ##顯示處于TIME-WAIT狀態(tài)的TCP連接個數(shù) echo "處于TIME-WAIT狀態(tài)的TCP連接個數(shù):$TCP_TIME_WAIT_Total" [root@liruilong ~]# sh /root/shell/day05/net.sh TCP連接總數(shù):15 UDP連接總數(shù):10 處于LISTEN狀態(tài)的TCP端口個數(shù):15 處于ESTAB狀態(tài)的TCP連接個數(shù):2 處于TIME-WAIT狀態(tài)的TCP連接個數(shù):0

      循環(huán)嵌套

      [root@liruilong ~]# mkdir /root/shell/day06 [root@liruilong ~]# vim /root/shell/day06/star.sh #!/bin/bash ####################### #此循環(huán)的作用是輸出5個*在同一行 for i in {1..5} do echo -n "*" done echo echo ######################## #內(nèi)層for循環(huán)在一行輸出5個*;外層for循環(huán),將內(nèi)層循環(huán)執(zhí)行5遍 for i in {1..5} do for j in {1..5} do echo -n "*" done echo done #####執(zhí)行腳本 [root@liruilong ~]# sh /root/shell/day06/star.sh ***** ***** ***** ***** ***** *****

      循環(huán)嵌套

      打印星星矩陣

      [root@liruilong ~]# mkdir -p /root/shell/day06 [root@liruilong ~]# vim /root/shell/day06/star.sh #!/bin/bash ####################### #此循環(huán)的作用是輸出5個*在同一行 for i in {1..5} do echo -n "*" done echo echo ######################## #內(nèi)層for循環(huán)在一行輸出5個*;外層for循環(huán),將內(nèi)層循環(huán)執(zhí)行5遍 for i in {1..5} do for j in {1..5} do echo -n "*" done echo done

      #####執(zhí)行腳本 [root@liruilong ~]# sh /root/shell/day06/star.sh ***** ***** ***** ***** ***** *****

      排列與組合

      [root@liruilong ~]# vim /root/shell/day06/compose.sh #!/bin/bash ###打印1-3的所有兩位數(shù)的排列組合方式 for i in {1..3} do for j in {1..3} do echo "${i}${j}" done done

      打印形狀

      [root@liruilong ~]# vim /root/shell/day06/sharp1.sh #!/bin/bash ####打印出上述圖片形狀 for((i=1;i<=6;i++)) do for((j=1;j<=i;j++)) do echo -ne "\033[46m \033[0m" done echo done ############ [root@liruilong ~]# vim /root/shell/day06/sharp2.sh #!/bin/bash ####打印出上述圖片形狀 for((i=1;i<=6;i++)) do for((j=6;j>=i;j--)) do echo -ne "\033[46m \033[0m" done echo done

      帶菜單的腳本

      [root@liruilong ~]# vim /root/shell/day06/menu.sh #!/bin/bash echo "1.查看剩余內(nèi)存容量." echo "2.查看根分區(qū)剩余容量." echo "3.查看cpu十五分鐘負(fù)載." echo "4.查看系統(tǒng)進(jìn)程數(shù)量." echo "5.查看系統(tǒng)賬戶數(shù)量." echo "6.退出." ###while死循環(huán),查看過程不退出,不需要繼續(xù)查看可以按6選擇退出 while : do read -p "請輸入選項[1-6]:" key ###case語句,對用戶輸入key進(jìn)行判斷給出相應(yīng)的結(jié)果 case $key in 1) free| awk '/Mem/{print $NF}';; 2) df | awk '/\/$/{print $4}';; 3) uptime | awk '{print $NF}';; 4) ps -aux | wc -l;; 5) sed -n '$=' /etc/passwd;; 6) exit;; esac done

      備份數(shù)據(jù)

      備份日志

      [root@liruilong ~]# vim /root/shell/day06/bak_log.sh #!/bin/bash ###此腳本運用日期定義備份的文件名,方便與每天進(jìn)行備份不重復(fù) date=`date +"%Y%m%d"` if [ ! -f /tmp/log-$date.tar.gz ];then tar -zcPf /tmp/log-$date.tar.gz /var/log fi ###執(zhí)行腳本并檢查輸出結(jié)果 [root@liruilong ~]# sh /root/shell/day06/bak_log.sh [root@liruilong ~]# ls /tmp/log-* /tmp/log-20200718.tar.gz

      備份數(shù)據(jù)庫

      邏輯備份

      ###安裝mariadb數(shù)據(jù)庫,重啟服務(wù) [root@liruilong ~]# yum -y install mariadb mariadb-server [root@liruilong ~]# systemctl restart mariadb ####查看數(shù)據(jù)庫服務(wù)的進(jìn)程信息 [root@liruilong ~]# ss -ntulpa | grep mysql tcp LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=9561,fd=14)

      ##mysqldump可以對數(shù)據(jù)庫中的庫進(jìn)行備份 ##格式: mysqldump -u"用戶名" --password="" 數(shù)據(jù)庫名 > 備份名.sql [root@liruilong ~]# mysqldump mysql > mysql.sql

      [root@liruilong ~]# vim /root/shell/day06/mysqldump.sh #!/bin/bash ###date 指定備份數(shù)據(jù)名;iuser 指定登錄數(shù)據(jù)庫的用戶 ###ipass 指定登錄密碼,默認(rèn)為空;db 指定要備份的數(shù)據(jù)庫 date=$(date +"%Y%m%d") iuser=root ipass= db=mysql ###文件在/tmp 下不存在時才會進(jìn)行備份 if [ ! -f /tmp/$db-$date.sql ];then mysqldump -u$iuser --password="$ipass" $db > /tmp/$db-$date.sql fi

      ###運行腳本 [root@liruilong ~]# sh /root/shell/day06/mysqldump.sh [root@liruilong ~]# ls -l /tmp/mysql-* -rw-r--r-- 1 root root 514619 7月 18 12:54 /tmp/mysql-20200718.sql

      物理備份(buttaidong)

      [root@liruilong ~]# vim /root/shell/day06/bak_mysql.sh #!/bin/bash ###對數(shù)據(jù)庫中的mysql庫下每一個表都進(jìn)行打包備份;備份文件存放在/tmp/mysql目錄下 date=$(date +"%Y%m%d") db_dir="/var/lib/mysql" db=mysql [ ! -d /tmp/$db ] && mkdir /tmp/$db for i in $(ls $db_dir/$db) do tar -zcf /tmp/$db/$i-$date.tar.gz $db_dir/$db/$i done ###運行腳本 [root@liruilong ~]# sh /root/shell/day06/bak_mysql.sh [root@liruilong ~]# ls /tmp/mysql

      mysql> show databases -> ; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> create databases liruilong; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'databases liruilong' at line 1 mysql> create database liruilong; Query OK, 1 row affected (0.02 sec) mysql> use liruilong; Database changed mysql> create table demo(id int(2),name varchar(20)); Query OK, 0 rows affected (0.04 sec) mysql>

      差異備份

      嗯,這個有些復(fù)雜。。。

      部署安裝 inotifywait 監(jiān)聽軟件

      [root@liruilong ~]# yum -y install gcc make #準(zhǔn)備源碼安裝環(huán)境 [root@liruilong ~]# tar -xvf tools.tar.gz #解壓tar包到當(dāng)前目錄下 ##源碼安裝必須先進(jìn)入到源碼包目錄下 [root@liruilong ~]# cd /root/inotify-tools-3.13/ [root@liruilong inotify-tools-3.13]# ./configure [root@liruilong inotify-tools-3.13]# make && make install #編譯安裝 [root@liruilong inotify-tools-3.13]# ##安裝成功后會生成兩個命令 [root@liruilong inotify-tools-3.13]# ls /usr/local/bin/ inotifywait inotifywatch

      部署httpd服務(wù)

      ##安裝apache的服務(wù) [root@liruilong ~]# yum -y install httpd ##重啟服務(wù) [root@liruilong ~]# systemctl restart httpd ##查看apache的端口號 [root@liruilong ~]# netstat -ntulpa | grep httpd tcp6 0 0 :::80 :::* LISTEN 15364/httpd ##安裝apache的服務(wù) [root@node ~]# yum -y install httpd ##重啟服務(wù) [root@node ~]# systemctl restart httpd ##查看apache的端口號 [root@node ~]# netstat -ntulpa | grep httpd tcp6 0 0 :::80 :::* LISTEN 15364/httpd

      生成密鑰,發(fā)送到 node上

      ####非交互式生成密鑰 [root@liruilong ~]# ssh-keygen -N '' -f /root/.ssh/id_rsa ###發(fā)送公鑰到虛擬機pc207上 [root@liruilong ~]# ssh-copy-id root@192.168.4.207

      差異備份【inotify+rsync】

      [root@liruilong ~]# vim /root/shell/day06/isync.sh #!/bin/bash ##from_dir 為要被同步的目錄 from_dir="/var/www/html/" ##將$from_dir下的內(nèi)容,同步到服務(wù)器192.168.4.207的/var/www/html/目錄下 rsync_cmd="rsync -az --delete $from_dir root@192.168.4.207:/var/www/html/" ##inotifywait監(jiān)聽 $from_dir 目錄,目錄下發(fā)生文件的變化時,執(zhí)行同步操作,腳本后臺運行 while inotifywait -rqq -e modify,move,create,delete,attrib $from_dir do $rsync_cmd done

      ###執(zhí)行腳本,查看后臺進(jìn)程 [root@liruilong ~]# sh /root/shell/day06/isync.sh & [1] 16532 [root@liruilong ~]# jobs -l [1]+ 9314 運行中 sh /root/shell/day06/rsync.sh & ###驗證結(jié)果 [root@liruilong ~]# cp /etc/passwd /var/www/html/ [root@liruilong ~]# ssh root@192.168.4.207 "ls /var/www/html" html passwd

      安全腳本

      HASH值

      HASH值

      HASH 值與文件名稱、時間、大小等信息無關(guān),僅與內(nèi)容有關(guān)

      MD5

      SHA256

      ######文件的內(nèi)容只要不發(fā)生變化,HASH值就是唯一的 ##計算文件的hash值 [root@liruilong ~]# md5sum /etc/passwd 6218010e73619a856999d39590a533f8 /etc/passwd ##只要文件內(nèi)容不變,hash值一樣 [root@liruilong ~]# cp /etc/passwd /root/pass [root@liruilong ~]# md5sum /root/pass 6218010e73619a856999d39590a533f8 /root/pass ##刪除了文件第5行,內(nèi)容發(fā)生變化,hash值改變 [root@liruilong ~]# sed -i '5d' /root/pass [root@liruilong ~]# md5sum /root/pass 449a721dd0449390377ae5216922faa7 /root/pass ###sha256sum和sha512sum都是計算hash值的,區(qū)別是長度不同 [root@liruilong ~]# sha256sum /etc/passwd db5560c8d21a9a4558272a2781ed1636eb40e7ebd709d5bca6751eb09db43383 /etc/passwd [root@liruilong ~]# sha512sum /etc/passwd c42b1c3531cd9d45c669845906f033c19cb40d626febdccd1e4834f1feb40730e4d52e0317dfd3f5 7f7406a23c10901be8d65787398beeae4513d71838f34803 /etc/passwd

      數(shù)據(jù)安全檢測腳本

      [root@liruilong ~]# vim /root/shell/day06/data.sh #!/bin/bash ###為/etc/下所有以 .conf 結(jié)尾的文件生成hash值,保存到/tmp/data.log文件中 for i in $(ls /etc/*.conf) do md5sum $i >> /tmp/data.log done

      ##運行腳本,查看結(jié)果 [root@liruilong ~]# sh /root/shell/day06/data.sh [root@liruilong ~]# cat /tmp/data.log

      SSH配置

      sshd配置

      sshd主配置文件:

      Port 3389 // 改用非標(biāo)準(zhǔn)端口

      PermitRootLogin no // 禁止root登錄

      UseDNS no //不解析客戶機地址

      AllowUsers 賬戶名 //設(shè)置遠(yuǎn)程連接的白名單,多個用戶空格分割

      ###拷貝遠(yuǎn)程服務(wù) sshd 的主配置文件 [root@liruilong ~]# cp /etc/ssh/sshd_config /opt/ [root@liruilong ~]# ls -l /opt/sshd_config -rw------- 1 root root 3907 7月 20 10:00 /opt/sshd_config ###過濾包含 port 的行 [root@liruilong ~]# grep -i "port" /opt/sshd_config ###使用sed刪除對應(yīng)行的注釋 [root@liruilong ~]# sed -n '/^#Port/s/#//p' /opt/sshd_config Port 22 ###過濾包含 permitrootlogin 的行 [root@liruilong ~]# grep -i 'permitrootlogin' /opt/sshd_config ###使用sed刪除對應(yīng)行的注釋 [root@liruilong ~]# sed -n '/^#PermitRootLogin/s/#//p' /opt/sshd_config PermitRootLogin yes ###過濾包含 usedns 的行 [root@liruilong ~]# grep -i "usedns" /opt/sshd_config ###使用sed刪除對應(yīng)行的注釋 [root@liruilong ~]# sed -n '/^#UseDNS/s/#//p' /opt/sshd_config UseDNS yes ###上述操作只是打印出來,-i 直接修改配置文件 [root@liruilong ~]# sed -i '/^#Port/s/#//' /opt/sshd_config [root@liruilong ~]# sed -i '/^#PermitRootLogin/s/#//' /opt/sshd_config [root@liruilong ~]# sed -i '/^#UseDNS/s/#//' /opt/sshd_config

      [root@liruilong ~]# vim /root/shell/day06/ssh_conf.sh #!/bin/bash ####安全的遠(yuǎn)程配置腳本 conf="/opt/sshd_config" sed -i '/^Port/s/22/1122/' $conf sed -i '/^PermitRootLogin/s/yes/no/' $conf sed -i '/^UseDNS/s/yes/no/' $conf sed -i '$a AllowUsers tom' $conf systemctl restart sshd

      ###運行腳本 [root@liruilong opt]# sh /root/shell/day06/ssh_conf.sh ###查看結(jié)果 [root@liruilong ~]# sed -n '/^Port/p' /opt/sshd_config Port 1122 [root@liruilong ~]# sed -n '/^PermitRootLogin/p' /opt/sshd_config PermitRootLogin no [root@liruilong ~]# sed -n '/^UseDNS/p' /opt/sshd_config UseDNS no [root@liruilong ~]# sed -n '$p' /opt/sshd_config AllowUsers tom

      、格式化輸出passwd

      格式輸出

      格式化輸出各式化輸出/etc/passwd,效果如下 :

      ###打印 用戶名,UID和家目錄 [root@liruilong ~]# awk -F: 'BEGIN{print "用戶名 UID 家目錄"} {print $1,$3,$6}' /etc/passwd 用戶名 UID 家目錄 root 0 /root bin 1 /bin daemon 2 /sbin ...... ###column -t 作用是對打印的內(nèi)容進(jìn)行排版 [root@liruilong ~]# awk -F: 'BEGIN{print "用戶名 UID 家目錄"} {print $1,$3,$6}' /etc/passwd | column -t 用戶名 UID 家目錄 root 0 /root bin 1 /bin daemon 2 /sbin

      過濾系統(tǒng)賬戶對應(yīng)的密碼

      在 awk中可以通過 -v 選項調(diào)用 shell 中的變量

      ###定義變量 hello [root@liruilong ~]# hello="nihao" ### -v 選項,可以引用shell中的變量,將變量hello的值賦予tmp [root@liruilong ~]# awk -v tmp=$hello 'BEGIN{print tmp}' nihao

      從 /etc/passwd 中將所有能登陸的賬戶名提取出來

      從 /etc/shadow 中提取賬戶對應(yīng)的密碼

      [root@liruilong ~]# sh /root/shell/day06/userpass.sh #!/bin/bash ###過濾出以bash結(jié)尾的用戶,賦予變量USER USER=$(awk -F: '/bash$/{print $1}' /etc/passwd) for i in $USER do awk -F: -v iuser=$i '$1==iuser{print $1,$2}' /etc/shadow done ##注意單獨使用時,$1=="root",要加雙引號,代表字符串 ## awk -F: '$1=="root"{print $1,$2}' /etc/shadow

      ###運行腳本 [root@liruilong ~]# sh /root/shell/day06/userpass.sh root $6$pAL3P7fovbgv4LEv$zwO6BZTMSfyfFcIZHO8S.TQc8RDuBtj4dj3wJ5CdH0clUue3G15.0C0PpytA wh9Lo.Dcxl1q0j6.z09yOGH32/ zhangzhao $6$mcBYSo/SxmOFm8l.$NxqB4us2UerMMPRPHn4u2v4BdFqkPBza/5NA1IV/Z3.knseF7sNS8.171OPx KULoW7KBYY6qyM0VNxF2r6I.h0

      、綜合案例

      一鍵PXE+kickstart

      PXE:

      PXE,全名Pre-boot Execution Environment,預(yù)啟動執(zhí)行環(huán)境;

      通過網(wǎng)絡(luò)接口啟動計算機,不依賴本地存儲設(shè)備(如硬盤)或本地已安裝的操作系統(tǒng);由Intel和Systemsoft公司于1999年9月20日公布的技術(shù);

      lient/Server的工作模式;PXE客戶端會調(diào)用網(wǎng)際協(xié)議(IP)、用戶數(shù)據(jù)報協(xié)議(UDP)、動態(tài)主機設(shè)定協(xié)議(DHCP)、小型文件傳輸協(xié)議(TFTP)等網(wǎng)絡(luò)協(xié)議;

      PXE客戶端(client)這個術(shù)語是指機器在PXE啟動過程中的角色。一個PXE客戶端可以是一臺服務(wù)器、筆記本電腦或者其他裝有PXE啟動代碼的機器(我們電腦的網(wǎng)卡)。

      1、啟動步驟詳解

      1、服務(wù)器加電啟動,從DHCP服務(wù)器獲取IP地址并加載(PXEClient)。

      2、通過TFTP服務(wù)器獲取網(wǎng)絡(luò)引導(dǎo)程序(pxelinux.0)。

      3、引導(dǎo)程序讀取配置文件(pxelinux.cfg本例中文件名為:default)。

      4、引導(dǎo)程序加載文件系統(tǒng)初始化(initrd)程序和內(nèi)核初始鏡像(vmlinuz)、自動應(yīng)答程序(ks.cfg)。

      5、按自動應(yīng)答文件中指定的網(wǎng)絡(luò)安裝方式,以FTP方式安裝linux系統(tǒng)。

      一鍵PXE+kickstart

      部署 PXE+kickstart 環(huán)境

      dhcp 服務(wù)

      tftp 服務(wù)

      http 服務(wù)

      kickstart 配置

      ###輸出多行文本 [root@liruilong ~]# cat << EOF > hello world > i am come here > i love the world > EOF hello world i am come here i love the world ###將多行文本保存到文件/opt/password中 [root@liruilong ~]# cat > /opt/password << EOF > hello world > i am come here > i love the world > EOF ###查看文件內(nèi)容跟 [root@liruilong ~]# cat /opt/password hello world i am come here i love the world [root@liruilong ~]# vim /root/shell/day06/pxe.sh #!/bin/bash ##定義變量,讓方便后面的調(diào)用,和提高適用性 DHCP_NET=192.168.4.0 DHCP_NETMASK=255.255.255.0 DHCP_MINIP=192.168.4.100 DHCP_MAXIP=192.168.4.200 DHCP_ROUTER=192.168.4.254 DHCP_NEXT_SERVER=192.168.4.5 HTTP_IP=192.168.4.5 ##安裝軟件包 yum -y install httpd dhcp tftp-server syslinux ##臨時停用SELinux setenforce 0 ##配置 DHCP 服務(wù) cat > /etc/dhcp/dhcpd.conf << EOF subnet $DHCP_NET netmask $DHCP_NETMASK { range $DHCP_MINIP $DHCP_MAXIP; option routers $DHCP_ROUTER; default-lease-time 600; max-lease-time 7200; next-server $DHCP_NEXT_SERVER; filename "pxelinux.0"; } EOF systemctl restart dhcpd systemctl enable dhcpd ##配置httpd共享服務(wù)器 if [ ! -e /dev/cdrom ];then echo "未檢測到系統(tǒng)光盤/dev/cdrom,請插入光盤后再試" exit fi [ -d /var/www/html/cdrom ] || mkdir /var/www/html/cdrom mount /dev/cdrom /var/www/html/cdrom systemctl start httpd ##配置kickstart 文件 cat > /var/www/html/ks.cfg << EOF install keyboard 'us' rootpw --plaintext redhat url --url="http://$HTTP_IP/cdrom" lang en_US firewall --disabled auth --useshadow --passalgo=sha512 text selinux --disabled network --bootproto=dhcp --device=eth0 reboot timezone Asia/Shanghai bootloader --location=mbr zerombr clearpart --all --initlabel part /boot --fstype="xfs" --size=500 part / --fstype="xfs" --grow --size=1 %packages @base %end EOF ####配置tftp服務(wù) cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ cp /var/www/html/cdrom/isolinux/* /var/lib/tftpboot/ [ -d /var/lib/tftpboot/pxelinux.cfg ] || mkdir /var/lib/tftpboot/pxelinux.cfg ##部署菜單文件 cat > /var/lib/tftpboot/pxelinux.cfg/default << EOF default vesamenu.c32 timeout 100 label linux menu label ^Install CentOS 7 kernel vmlinuz append initrd=initrd.img ks=http://$HTTP_IP/ks.cfg EOF systemctl start tftp ##臨時清空防火墻規(guī)則 iptables -F ###執(zhí)行腳本 [root@liruilong ~]# sh /root/shell/day06/pxe.sh ###檢查三個服務(wù)【dhcpd,httpd,tftp】是否已經(jīng)運行 [root@liruilong ~]# systemctl status dhcpd | grep Active Active: active (running) since 一 2020-07-20 12:06:31 CST; 16min ago [root@liruilong ~]# systemctl status tftp | grep Active Active: active (running) since 一 2020-07-20 12:05:35 CST; 17min ago [root@liruilong ~]# systemctl status httpd | grep Active Active: active (running) since 一 2020-07-20 12:05:34 CST; 17min ago

      Linux Shell

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel表格分欄的方法步驟詳解(excel表格分欄)
      下一篇:Excel表格怎樣給邊框添加顏色(如何給表格邊框添加顏色)
      相關(guān)文章
      久久狠狠爱亚洲综合影院 | 亚洲第一黄片大全| 亚洲精品无码成人片久久不卡| 亚洲成av人片在www鸭子| 亚洲码一区二区三区| 亚洲日韩小电影在线观看| 亚洲成AV人片在WWW| 亚洲一区二区影视| 老司机亚洲精品影院| 亚洲国产精品人人做人人爱| 亚洲日本在线观看网址| 国产AV无码专区亚洲AV毛网站| 精品国产日韩亚洲一区在线| 亚洲高清无在码在线电影不卡| 自拍偷自拍亚洲精品第1页| 亚洲av成人一区二区三区在线播放 | 久久亚洲AV无码西西人体| 亚洲人AV在线无码影院观看| 亚洲综合激情视频| 亚洲国产成人超福利久久精品| 国产av天堂亚洲国产av天堂| 亚洲av午夜福利精品一区| 亚洲日本一区二区三区在线不卡| 99亚偷拍自图区亚洲| 在线免费观看亚洲| 亚洲自偷自拍另类图片二区| 亚洲综合视频在线观看| 亚洲电影唐人社一区二区| 亚洲乱码日产精品BD在线观看| 久久亚洲精品专区蓝色区| 亚洲AV男人的天堂在线观看| 亚洲网站在线观看| 亚洲国产日韩在线人成下载| 亚洲综合精品伊人久久| 妇女自拍偷自拍亚洲精品| 亚洲va中文字幕| 亚洲欧洲日产国码一级毛片 | 亚洲日韩在线第一页| 亚洲日韩欧洲无码av夜夜摸| 日韩亚洲Av人人夜夜澡人人爽 | 亚洲精品伊人久久久久|