shell腳本練習題(編程題)。

1.shell開發運維管理工具。

要求:用戶交互,當用戶輸入菜單號時,打印相關內容。

菜單

  1. 磁盤分區

  2. CPU負載

  3. 剩餘內存

  4. 退出

輸入:1

輸出:(主機名,系統版本,分區情況)

​ hostname:

​ system:系統版本

​ ---------分區一-----------(分區變量輸出)

​ path:分區一

​ size:大小

​ file_os:分區文件系統類型

​ mount_on:分區掛載點

​ ----------分區二----------

​ path:分區二

​ size:大小

​ file_os:分區文件系統類型

​ mount_on:分區掛載點

輸入:2

輸出:

1分鐘平均負載:

5分鐘平均負載:

15分鐘平均負載:

輸入:3

輸出:

目前可用內存:

可用Swap分區:

輸入:4

輸出:

Bey…

#!/bin/bash
while true
do
#格式化輸出以下菜單
cat <<EOF        
              -------------------菜單---------------------
              -              1.查看磁盤分區              -
              -              2.CPU負載                   -
              -              3.剩餘內存                  -
              -              4.退出                      -  
              --------------------------------------------
EOF
#接受用戶輸入的一個值
read -p "請輸入你要執行的操作:>>>" num
#實現第一個功能:查看磁盤分區
PART(){               
  echo "hostname:$HOSTNAME"                            #獲取主機名
  echo "system: `cat /etc/redhat-release`"             #獲取系統內核版本
  #定義數組,獲取磁盤分區放入其中。
  array1=(`lsblk -l |awk '/sd[a-z][0-9]/{print $1}'`)  #磁盤名
  array2=(`lsblk -l |awk '/sd[a-z][0-9]/{print $4}'`)  #大小
  array3=(`lsblk -l |awk '/sd[a-z][0-9]/{print $6}'`)  #類型
  array4=(`lsblk -l |awk '/sd[a-z][0-9]/{print $7}'`)  #掛載點
  #遍歷數組
  num=`echo $((${#array1[@]}-1))`  #獲取數組長度-1的值,給num(這裏是3)
  for i in `seq 0 $num`            #i:0-3
  do
 #循環輸出數組1中0到3位置值
cat <<EOF
                                   ---------${array1[$i]}-----------
                                        path: ${array1[$i]}
                                        size: ${array2[$i]}
                                        file_os: ${array3[$i]}
                                        mount_on:${array4[$i]}
EOF
done
}
#實現第二個功能:查看cpu負載
LOADING(){                          #通過uptime命令,和awk,獲取平均負載。
uptime |awk -F [:,] '{print "一分鐘平均負載:",$(NF-2)"\n""五分鐘平均分在:",$(NF-1)"\n""十五分鐘平均負載:",$NF}'
}                                  #$NF:從最後一列開始取。
#實現第三個功能:查看內存和swap
MEM(){
var=("目前可用內存:" "可用swap分區:")
n=0
for i in `free -h |awk '/^[^[:space:]]/ {print $4}'`    #取出內存和swap,進行遍歷
do
echo ${var[$n]} $i            #爲滿足題目要求,(說明+內容),將說明放入數組依次輸出+內容
let n++                       #n從0開始自加,實現數組依次輸出。
done
}
#利用case語句捕獲用戶鍵入的值。
#模式匹配成功,則執行相應函數。
case $num in
   1)        
   PART
   ;;
   2)
   LOADING
   ;;
   3)
   MEM
   ;;
   4)
   exit 0
   ;;
   *)
   echo "please input true list..."
esac

done
2.設計一個shell 程序,在每天凌晨壓縮打包/etc目錄下的所有內容,存放在/root/bak 目錄裏,且文件名爲如下形式yymmdd_etc.tar.gz(yy爲年,mm爲月,dd爲日),該目錄保存7天內容;每天凌晨3點增量同步到備份服務器/backup目錄下,每週六凌晨3點全量同步到備份服務的/backup目錄下;備份服務器/backup下保留一個月的備份文件。Shell程序fileback存放在/usr/bin目錄下。(10分)

分析;

1.打包壓縮/etc目錄下的所有內容,存放在/root/bak 目錄

2.本地保存7天

3.增量備份

4.全量備份

5.服務器備份一個月

#!/bin/bash
#定義變量,方便日後修改
back_file_name=`date +%Y%m%d`.tar.gz
back_file_dir=/root/bak
backup_server_user=rsync_backup
backup_server_pass=123456
root_pass=123456
backup_server_IP=192.168.42.159
mail_owner=[email protected]
mail_topic="web data backup"

data_tar(){                                           #定義用於壓縮函數
    [ -d $back_file_dir ] || mkdir -p $back_file_dir  #判斷/root/bak備份的目錄是否存在,不存在就創建。
    tar -czf $back_file_dir/$back_file_name /etc/*    #將/etc下所有內容進行打包/root/bak/下以時間命名。
}

data_trace(){                                         #進行增量備份
rsync -avz $back_file_dir $backup_server_user@$backup_server_IP::backup --password-file=/etc/rsync.password
}       #rsync將本地/root/bak新增的文件備份到備份主機上
        #--password-file中存儲了rsync的密碼,避免了交互輸入密碼

data_trace_all(){    #實現全量備份
    sshpass -p $root_pass scp -o StrictHostKeyChecking=no -rp $back_file_dir/* [email protected]:/backup
#sshappss -p 123456 scp -rp $back_file_dir [email protected]:/backup/
}        #sshpass工具實現了自動輸入密碼
         #-o StrictHostKeyChecking參數實現了自動輸入yes or no,避免了人機交互
         #利用scp將/root/bak下所有內容進行備份,以root身份備份到對應主機的/backup目錄下

clean_over_localdata(){   #清除本地7天前的的所有文件
    find $back_file_dir -mtime +7 -exec rm {} -rf \;
}

clean_over_remodata(){ #利用ssh連接備份服務器,將服務器中一個月之前的文件刪除
    sshpass -p 123456 ssh -o StrictHostKeyChecking=no 192.168.42.159 "find /backup/ -mtime +30 -exec rm {} -rf \;"
}

case $1 in
    data_tar)
        data_tar
        ;;
    trace_all)
        data_trace_all
        ;;
    data_trace)
        data_trace
        ;;
    data_diff)
        data_diff
        ;;
    clean_over_localdata)
        clean_over_lcoaldata
        ;;
    clean_remodata)
        clean_over_remodata
        ;;
    *)
        echo "please input true paramater..."   #如果輸入的不是有效參數,則輸出*

esac

3.shell實現100臺服務器的公鑰的批量分發;LLD規劃:100臺服務器ip爲:192.168.42.101-201,root密碼:123456。

分析:

1.如何創建祕鑰

2.檢查與服務器之間的通訊

3.分發祕鑰(分發祕鑰時,會遇到各種交互問題)

[root@backup ~]# cat keypir.sh 
#!/bin/bash
password=123456

#創建祕鑰對---(ssh-keygen),寫入指定文件
CreateKeyPair(){                         
ssh-keygen -f /root/.ssh/id_rsa -P ""    #-P:創建的祕鑰是否設置密碼,此處不設置密碼。
}

#檢查100臺服務器網絡是否暢通
CHECK(){                                 
ping -c 1 192.168.42.$i &>/dev/null
if [ $? -eq 0 ]                          #$? 返回爲0時,說明網絡暢通
then
return 1
else
return 0
fi
}

#分發祕鑰
TRACE(){
which sshpass &>/dev/null     #確定sshpass是否安裝,對方服務器可能沒有安裝
if [ $? -ne 0 ]               #通過which命令判斷sshpass是否安裝,安裝了echo $?則返回0
then                          #$?不爲0時,則說明沒有安裝
yum install sshpass -y
#sshpass -p $password ssh-copy-id -o StrictKeyHostChecking  192.168.42.$i
sshpass -p $password scp -p -o StrictHostKeyChecking=no /root/.ssh/id_rsa.pub 192.168.42.$i:/tmp/                 #使用sshpass工具和-o參數實現避免交互輸入yes和密碼
                                    #將本地/root/.ssh/id_rsa.pub(生成的祕鑰文件),傳輸到對應服務器上/tmp/目錄下,此時不能直接傳到/root/.ssh目錄下,避免其他機器同樣操作覆蓋文件。
sshpass -p $password ssh -o StrictHostKeyChecking=no 192.168.42.$i "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys"           
#ssh連接服務器,將/tmp/下密碼文件寫如入/root/.ssh/authorized_keys
sshpass -p $password ssh -o StrictHostKeyChecking=no 192.168.42.$i "chmod 600 /root/.ssh/authorized_keys"           #修改文件權限
sshpass -p $password ssh -o StrictHostKeyChecking=no 192.168.42.$i "rm -rf /tmp/id_rsa.pub"                      #由於是祕鑰文件,爲了安全起見,用完刪除

else                                  #如果sshpass工具安裝,則直接執行。
#sshpass -p $password ssh-copy-id 192.168.42.$i
sshpass -p $password scp -p -o StrictHostKeyChecking=no /root/.ssh/id_rsa.pub 192.168.42.$i:/tmp/
sshpass -p $password ssh -o StrictHostKeyChecking=no 192.168.42.$i "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" 
sshpass -p $password ssh -o StrictHostKeyChecking=no 192.168.42.$i "chmod 600 /root/.ssh/authorized_keys"
sshpass -p $password ssh -o StrictHostKeyChecking=no 192.168.42.$i "rm -rf /tmp/id_rsa.pub"
fi
}

#主函數,調用上方定義的函數,實現功能
MAIN(){                
for i in {101..201}
do
CHECK
if [ $? -eq 1 ]                     #調用CHECK檢查網絡是否暢通,return=1時(暢通)
then
    if [ -f /root/.ssh/id_rsa.pub ]  #暢通的話,檢查祕鑰文件是否存在
    then
       TRACE                         #執行TRACE函數,分發祕鑰
    else
       CreateKeyPair                  #創建祕鑰
       TRACE                          #分發祕鑰
    fi
else                  #不通時
echo " 192.168.42.$i is unreachable..."

fi
done 
}

MAIN
有個哥們,每天必須喫一葷一素;用腳本實現搭配的最低消費

1食堂:中國人(人民幣)

2食堂:外國人(美元)

匯率,6.798

菜單:
宮保雞丁(1): 8.6 ¥
豆芽炒青菜(1):5.5 ¥

魚香肉絲(2):2.5 $
椒鹽蘑菇(2):1.9 $

[root@fei-8 tmp]# cat restaurant.sh 
#!/bin/bash
#Author:fei
#Blog://blog.csdn.net/wdwangye
#Time:2020-07-01 12:39:45
#Name:restaurant.sh
#Version:V1.0
#Description:This is a test script.


a=`cat file |grep \(1\)`                  #將1號食堂的菜放入字符串a中。
array01=(`cat file|grep \(2\)`)           #由於2號食堂的菜價爲美元,需要換算爲rmb,所以先存入數組。
b=`for i in ${array01[*]};do echo $i;done |awk -F":"  '{print $1":"$2*6.798}' ` #遍歷數組,計算2號食堂菜價。

for i in $a                     #將一號食堂菜放入,file.txt中
do
    echo $i >> file.txt
done

for j in $b
do
    echo $j >> file.txt
done

array02=(`cat file.txt|grep -w 葷`)               #將file.txt中的葷菜放入數組
array03=(`cat file.txt|grep -w 素`)

c=`for k in ${array02[*]};do echo $k;done |sort -nt: -k2|head -1`      #遍歷數組,排序,取出價格最低的一個
d=`for l in ${array03[*]};do echo $l;done |sort -nt: -k2|head -1`

echo "今天要喫的葷菜是:" $c
echo "今天要喫的素菜是:" $d

rm -rf file.txt       #由於每天菜譜不同,每天用完之後刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章