天天看點

Linux shell腳本入門

兩台虛拟機,均要檢測

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 

 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/1.txt /etc/ &> /opt/a.txt

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

三、書寫建立使用者并設定密碼的腳本

     /dev/null  #Linux黑洞裝置,專用于收集不要的輸出結果

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

 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   :可以産生互動,将鍵盤輸入的内容指派給變量

 read  -p  '請輸入您要建立的使用者:'   user

 read  -p  '請輸入您要設定的密碼:'   pass

 useradd  $user  &> /dev/null

 echo $user建立成功

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

 echo $user密碼設定成功

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

什麼是變量

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

– 變量名=變量值

– 友善以固定名稱重複使用某個值

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

設定變量時的注意事項

– 若指定的變量名已存在,相當于為此變量重新指派

– 等号兩邊不要有空格

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

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

基本格式

– 引用變量值:$變量名

– 檢視變量值:echo $變量名、echo ${變量名}

 變量的種類

位置變量

在執行腳本時提供的指令行參數(非互動式傳值)

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

 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 

 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]# mkdir   MariaDB-$(date +%F)

[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

 if  [ $1 -eq $2 ];then

   echo hello

   echo hi

[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

      指令序列zz

    成績    大于等于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

  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

 if [  $1  ==  redhat  ];then

   echo  fedora

 elif [  $1  ==  fedora  ];then

   echo  redhat

   echo  '/root/foo.sh  redhat|fedora'

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

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

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

 if [ $# -eq 0 ];then

   echo '/root/foo.sh  redhat|fedora'

  elif [ $1 == redhat ];then

   echo fedora

  elif [ $1 == fedora ];then

   echo redhat

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

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

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

   echo '/root/foo.sh  redhat|fedora'  >&2   #将正确輸出變成錯誤

   exit 2                                   #腳本退出傳回值

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

 for循環結構

  循環結構:将反複執行的語句,循環去執行

  for 變量名 in   值清單

  do

        指令序列

  done

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

  for a in 1 2 3 4 5

    useradd nsd$a

    echo nsd$a建立成功

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

      echo hello

案例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

    echo 'Usage: /root/batchusers' >&2

    exit 1

 if [ ! -e $1 ];then

    echo 'Input file not found' >&2

    exit 2

 for  a  in $(cat $1)

 do

    useradd -s /bin/false $a

    echo $a建立成功

 done

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

 if [ -e $1 ];then

    for  a  in $(cat $1)

     do

     done

  else

繼續閱讀