1. 程式人生 > >Linux shell腳本入門

Linux shell腳本入門

雲計算基礎 linux基礎

兩臺虛擬機,均要檢測


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

rm -rf /etc/yum.repos.d/*

echo ‘[dvd]

name=dvd

baseurl=http://172.25.254.254/content/rhel7.0/x86_64/dvd/

enabled=1

gpgcheck=0‘ > /etc/yum.repos.d/haha.repo

yum clean all

yum repolist


[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



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



#!/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


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

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 shell腳本入門