LINUX系統工程師技術(Engineer)-------第五天
兩臺虛擬機,均要檢測
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)-------第五天