1. 程式人生 > >LINUX系統工程師技術(Engineer)-------第五天

LINUX系統工程師技術(Engineer)-------第五天

shell腳本基礎 for、if、while的腳本


兩臺虛擬機,均要檢測


1. Yum是否可用

2. ?防火墻默認區域修改為trusted

3. IP地址是否配置


#######################################################




二、普通用戶(必須還原環境)

??

? ? ?客戶端普通用戶訪問服務端nfs-server服務,

? ? ?服務端會以客戶端相同UID身份的本地用戶進行權限判定


? ? LDAP : ?網絡用戶,提供用戶名

? ? kerberos : 密碼驗證,實現“一次密碼認證,多次免密登錄”的通行證機制



1.兩臺虛擬機都運行腳本,加入LDAP與kerberos

??

? # lab nfskrb5 setup


2.服務端修改配置文件,創建讀寫的共享

[root@server0 ~]# mkdir /test

[root@server0 ~]# vim /etc/exports


? ?/test ?*(rw,sec=krb5p)


3.服務端部署加密的密鑰

# wget http://172.25.254.254/pub/keytabs/server0.keytab ?-O /etc/krb5.keytab


# ls ?/etc/krb5.keytab


4.服務端 重起 nfs-server 與 nfs-secure-server?


# systemctl restart ?nfs-server ?nfs-secure-server?


5.服務端保證ldapuser0用戶有寫權限,設置本地權限

[root@server0 ~]# setfacl -m u:ldapuser0:rwx /test

[root@server0 ~]# getfacl /test


6.客戶端訪問與掛載共享

[root@desktop0 ~]# showmount -e 172.25.0.11

[root@desktop0 ~]# mkdir /mnt/nfs

[root@desktop0 ~]# vim /etc/fstab?


?172.25.0.11:/test ?/mnt/nfs ?nfs ?_netdev,sec=krb5p ?0 ?0


7.客戶端部署密鑰文件,重起相關的服務

# wget http://172.25.254.254/pub/keytabs/desktop0.keytab ?-O /etc/krb5.keytab


# systemctl restart nfs nfs-secure


8.客戶端驗證掛載,寫入(必須采用ssh方式,su不經過kerberos驗證)

[root@desktop0 ~]# mount -a

[root@desktop0 ~]# df -h


[root@desktop0 ~]# ssh [email protected]


[ldapuser0@desktop0 ~]$ cd /mnt/nfs/

[ldapuser0@desktop0 nfs]$ touch 1.txt

[ldapuser0@desktop0 nfs]$ ls

1.txt

[ldapuser0@desktop0 nfs]$ exit


########################################################

?Shell腳本


? ? ?腳本:可以執行文件,運行後可以實現某種功能(命令的堆積,非交互)



規範Shell腳本的一般組成

? #! 環境聲明(Sha-Bang)

? # 註釋文本

? 可執行代碼




一、書寫第一腳本程序

[root@server0 ~]# vim /root/1.sh?


?#!/bin/bash

?echo hello world

?hostname

?cat ?/etc/redhat-release

?ifconfig | head -2 ?| tail -1


[root@server0 ~]# /root/1.sh


二、書寫為Server0自動搭建Yum的腳本

[root@server0 ~]# vim /root/yum.sh?

?#!/bin/bash

?da


[root@server0 ~]# chmod +x /root/yum.sh

[root@server0 ~]# /root/yum.sh

管道傳遞

? 使用 | 管道操作

– 將前一條命令的標準輸出交給後一條命令處理



三、重定向輸出


? ? >:只收集前面命令的正確輸出

? ? 2>:只收集前面命令的錯誤輸出

? ? &>:收集前面命令的錯誤與正確輸出


[root@server0 ~]# echo 123 > /opt/1.txt

[root@server0 ~]# cat /opt/1.txt


[root@server0 ~]# cat /opt/1.txt /etc/

[root@server0 ~]# cat /opt/1.txt /etc/ > /opt/a.txt

[root@server0 ~]# cat /opt/a.txt


[root@server0 ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt

[root@server0 ~]# cat /opt/a.txt


[root@server0 ~]# cat /opt/1.txt /etc/ &> /opt/a.txt

[root@server0 ~]# cat /opt/a.txt


######################################################

三、書寫創建用戶並設置密碼的腳本

? ? ?/dev/null ?#Linux黑洞設備,專用於收集不要的輸出結果


[root@server0 ~]# vim /root/user.sh


?#!/bin/bash

?useradd test06 &> /dev/null

?echo test06創建成功

?echo 123 | passwd --stdin test06 &> /dev/null

?echo test06密碼設置成功


[root@server0 ~]# ?chmod +x /root/user.sh

[root@server0 ~]# /root/user.sh

??

? ?變量:為了增加腳本的適用環境的能力,增加腳本的靈活度,方便。-----------引進變量


? ?變量: 容器,以不變的名稱,儲存變化的值


? ? ? 變量名=變化的值


? 使用變量: ? ?$變量名



? ?為了降低腳本使用難度,可以產生交互

? read ? :可以產生交互,將鍵盤輸入的內容賦值給變量



[root@server0 ~]# vim /root/user.sh

?#!/bin/bash

?read ?-p ?‘請輸入您要建立的用戶:‘ ? user

?read ?-p ?‘請輸入您要設置的密碼:‘ ? pass

?useradd ?$user ?&> /dev/null

?echo $user創建成功

?echo $pass | passwd --stdin $user &> /dev/null

?echo $user密碼設置成功


[root@server0 ~]# /root/user.sh







#########################################################

什麽是變量

? 以不變的名稱存放的可能會變化的值

– 變量名=變量值

– 方便以固定名稱重復使用某個值

– 提高對任務需求、運行環境變化的適應能力



? 設置變量時的註意事項

– 若指定的變量名已存在,相當於為此變量重新賦值

– 等號兩邊不要有空格

– 變量名由字母/數字/下劃線組成,區分大小寫

– 變量名不能以數字開頭,不要使用關鍵字和特殊字符



? 基本格式

– 引用變量值:$變量名

– 查看變量值:echo $變量名、echo ${變量名}



?變量的種類




位置變量

? 在執行腳本時提供的命令行參數(非交互式傳值)


[root@server0 ~]# vim ?/root/2.sh

?#!/bin/bash

?echo $1

?echo $2

?echo $3

?echo ${10}

?echo ${11}


# /root/2.sh haha ?benniu ?xixi ?hehe ? lele ? dc ?tc ? dz ? tz 100 200


[root@server0 ~]# vim /root/3.sh

? #!/bin/bash

? cat -n $1 ?| ?head -$2?


[root@server0 ~]# /root/3.sh /etc/passwd ? 2

[root@server0 ~]# /root/3.sh /etc/passwd ? 3




?預定義變量

? ? 用來保存腳本程序的執行信息

– 直接使用這些變量

– 不能直接為這些變量賦值


? $# ?已加載的位置變量的個數

$* ?所有位置變量的值

$? ?程序退出後的狀態值,0表示正常,其他值異常




[root@server0 ~]# vim /root/2.sh?


?#!/bin/bash

?echo $1

?echo $2

?echo $3

?echo ${10}

?echo ${11}

?echo $#

?echo $*


[root@server0 ~]# /root/2.sh ?1 ?2 3 4 5 6 7 8 9 10 11



########################################################

?運算?

??

[root@server0 ~]# expr 10 / 3


[root@server0 ~]# expr 10 \* 3


[root@server0 ~]# expr 1 + 2


[root@server0 ~]# expr 3 - 1


[root@server0 ~]# expr 10 ?% ?3 ? ?#取余數 運算


? $() :將命令的輸出結果,作為參數


[root@server0 opt]# date

[root@server0 opt]# date +%F

[root@server0 opt]# cd /opt


[root@server0 opt]# mkdir ? $(date +%F)

[root@server0 opt]# ls

[root@server0 opt]# mkdir ? mydir-$(date +%F)

[root@server0 opt]# ls

[root@server0 opt]# mkdir ? MariaDB-$(date +%F)

[root@server0 opt]# ls

[root@server0 opt]# mkdir ? $(hostname)-$(date +%F)


#######################################################

常用的測試選項


? 檢查文件狀態

-e:文檔存在為真

-d:文檔存在且為目錄為真

-f:文檔存在且為文件為真

-r:文檔存在且有讀取權限為真

-w:文檔存在且有寫入權限為真

-x:文檔存在且有執行權限為真


? 比較整數大小(帶e都有等於二字,g代表大於,l代表小於)---------只對於數字而言


-gt:大於

-ge:大於等於

-eq:等於

-ne:不等於

-lt:小於

-le:小於等於


? 字符串比對

== :相等

!=:不相等



########################################################




?if [ 條件測試 ] ; then

? ? ?命令序列xx

?else

? ? ?命令序列yy

?fi


[root@server0 /]# vim ?/root/5.sh

?#!/bin/bash

?if ?[ $1 -eq $2 ];then

? ?echo hello

?else

? ?echo hi

?fi


[root@server0 /]# /root/5.sh ?1 1?


[root@server0 /]# /root/5.sh ?1 2



? ?請書寫一個腳本:

? ? ? 用戶輸入一個IP地址(read),判斷是否可以與該IP地址通信,

? ?能通則輸出 "IP ok" ? 否則 輸出 "IP no"


[root@server0 /]# vim ?/root/6.sh


? ?#!/bin/bash

? ?read ?-p ?‘請輸入一個IP地址:‘ ? ?ip

? ?ping ?-c ?2 ?$ip ?&> /dev/null


? ? ?if [ $? -eq 0 ];then

? ? ? ? ? echo ?${ip} ok

? ? ? else

? ? ? ? ? echo ?${ip} no?

? ? ?fi?


[root@server0 /]# ? /root/6.sh


######################################################



?if [條件測試1] ; then

? ? ? 命令序列xx

?elif [條件測試2] ; then

? ? ? 命令序列yy

?else

? ? ? 命令序列zz

?fi

??

? ? ?

? ? 成績 ? ?大於等於90 ? ?優秀

?大於等於80 ? ?良好 ? ? ? ? ? ??

?大於等於70 ? ?及格 ?

?大於等於60 ? ?仍需努力 ?

?60以下 ? ? ? ? ?在牛的肖邦,也彈不出哥憂傷





[root@server0 ~]# vim /root/8.sh

#!/bin/bash

?read -p ?‘請輸入您的成績:‘ ? ? num

if [ $num -gt ?100 ];then

? ? ?echo 成績有誤

? elif [ $num -lt 0 ];then

? ? ?echo 成績有誤

? elif [ $num -ge 90 ];then

? ? ?echo 優秀

? elif [ $num -ge 80 ];then

? ? ?echo 良好

? elif [ $num -ge 70 ];then

? ? ?echo 及格

? elif [ $num -ge 60 ];then

? ? ?echo 仍需努力

? else?

? ? echo 在牛的肖邦,也彈不出哥憂傷

fi

#####################################################



在 server0 上創建 /root/foo.sh 腳本

1)當運行/root/foo.sh redhat,輸出為fedora

2)當運行/root/foo.sh fedora,輸出為redhat

3)當沒有任何參數或者參數不是 redhat 或者

fedora時,其錯誤輸出產生以下信息:?

? /root/foo.sh ?redhat|fedora








? ? ?‘ ‘:把所有的特殊字符,當作普通文本字符輸出


[root@server0 ~]# vim ?/root/foo.sh

?#!/bin/bash

?if [ ?$1 ?== ?redhat ?];then

? ?echo ?fedora

?elif [ ?$1 ?== ?fedora ?];then

? ?echo ?redhat

?else

? ?echo ?‘/root/foo.sh ?redhat|fedora‘

?fi


[root@server0 ~]# /root/foo.sh redhat

[root@server0 ~]# /root/foo.sh fedora


[root@server0 ~]# /root/foo.sh haha





?#!/bin/bash

?if [ $# -eq 0 ];then

? ?echo ‘/root/foo.sh ?redhat|fedora‘

? elif [ $1 == redhat ];then

? ?echo fedora

? elif [ $1 == fedora ];then

? ?echo redhat

?else

? ?echo ‘/root/foo.sh ?redhat|fedora‘

?fi



? ? ??

? ? ? ?" ":可以將 “沒有” 變成 “ 空值”



? ? ? ?" " 要使==他們兩相等,在" "中間必須要有添加東西,否則" "和==不相等,列如"$1" == redhat?


?#!/bin/bash


?if [ ?"$1" == redhat ];then

? ?echo fedora

? elif [ "$1" == fedora ];then

? ?echo redhat

?else

? ?echo ‘/root/foo.sh ?redhat|fedora‘ ?>&2 ? #將正確輸出變成錯誤

? ?exit 2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #腳本退出返回值

?fi


補充:echo ‘/root/foo.sh ?redhat|fedora‘ ?>&2-----本來echo‘ ‘裏面跟的東西是錯誤的但是Linux不知道輸出來的東西是錯的,所以要想變成錯誤輸出在後面跟上 >&2,這樣就可以把錯誤的信息輸出來。然後在添加一個返回值,exit 1,這樣就知道是錯誤還是正確




####################################################

?for循環結構


? 循環結構:將反復執行的語句,循環去執行



? for 變量名 in ? 值列表

? do

? ? ? ? 命令序列

? done





[root@server0 /]# vim ?/root/for.sh

? #!/bin/bash

? for a in 1 2 3 4 5

? do

? ? useradd nsd$a

? ? echo nsd$a創建成功

? done


[root@server0 /]# vim ?/root/for02.sh

? #!/bin/bash

? for a in 1 2 3 4 5

? do

? ? ? echo hello

? done


######################################################


案例5:編寫一個批量添加用戶腳本

? ? ? ? ? ?在 server0 上創建 /root/batchusers 腳本

1)此腳本要求提供用戶名列表文件作為參數

2)如果沒有提供參數,此腳本應該給出提示?

? ? ? ?Usage: /root/batchusers,退出並返回相應值

3)如果提供一個不存在的文件,此腳本應該給出提

示 Input file not found,退出並返回相應值

4)新用戶的登錄Shell為 /bin/false,無需設置密碼

5)用戶列表測試文件:

http://classroom/pub/materials/userlist


?

# wget http://classroom/pub/materials/userlist?


[root@server0 /]# vim ?/root/batchusers

?#!/bin/bash

?if [ $# -eq 0 ];then

? ? echo ‘Usage: /root/batchusers‘ >&2

? ? exit 1

?fi

?if [ ! -e $1 ];then

? ? echo ‘Input file not found‘ >&2

? ? exit 2

?fi

?for ?a ?in $(cat $1)

?do

? ? useradd -s /bin/false $a

? ? echo $a創建成功

?done


##################################################




?#!/bin/bash

?if [ $# -eq 0 ];then

? ? echo ‘Usage: /root/batchusers‘ >&2

? ? exit 1

?fi

?if [ -e $1 ];then

? ? for ?a ?in $(cat $1)

? ? ?do

? ? useradd -s /bin/false $a

? ? echo $a創建成功

? ? ?done

? else

? ? echo ‘Input file not found‘ >&2

? ? exit 2

?fi


###################################################




































































#########################################################




































? ? ? ? ?









?


























LINUX系統工程師技術(Engineer)-------第五天