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

筆記是上課后整理的筆記,適合溫習(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ù)運算
我們沒有該軟件則需要使用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)容。