1.shell開發運維管理工具。
要求:用戶交互,當用戶輸入菜單號時,打印相關內容。
菜單
-
磁盤分區
-
CPU負載
-
剩餘內存
-
退出
輸入: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 #由於每天菜譜不同,每天用完之後刪除