shell編程15例(一)
VSole2022-03-23 07:53:04
1、編寫hello world腳本
#!/bin/bash # 編寫hello world腳本 echo "Hello World!"
2、通過位置變量創建 Linux 系統賬戶及密碼
#!/bin/bash # 通過位置變量創建 Linux 系統賬戶及密碼 #$1 是執行腳本的第一個參數,$2 是執行腳本的第二個參數 useradd "$1" echo "$2" | passwd ‐‐stdin "$1"
3、備份日志
#!/bin/bash # 每周 5 使用 tar 命令備份/var/log 下的所有日志文件 # vim /root/logbak.sh # 編寫備份腳本,備份后的文件名包含日期標簽,防止后面的備份將前面的備份數據覆蓋 # 注意 date 命令需要使用反引號括起來,反引號在鍵盤<tab>鍵上面 tar -czf log-`date +%Y%m%d`.tar.gz /var/log # crontab ‐e #編寫計劃任務,執行備份腳本 00 03 * * 5 /root/logbak.sh
4、一鍵部署 LNMP(RPM 包版本)
#!/bin/bash # 一鍵部署 LNMP(RPM 包版本) # 使用 yum 安裝部署 LNMP,需要提前配置好 yum 源,否則該腳本會失敗 # 本腳本使用于 centos7.2 或 RHEL7.2 yum ‐y install httpd yum ‐y install mariadb mariadb‐devel mariadb‐server yum ‐y install php php‐mysql systemctl start httpd mariadb systemctl enable httpd mariadb
5、監控內存和磁盤容量,小于給定值時報警
#!/bin/bash
# 實時監控本機內存和硬盤剩余空間,剩余內存小于500M、根分區剩余空間小于1000M時,發送報警郵件給root管理員
# 提取根分區剩余空間
disk_size=$(df / | awk '/\//{print $4}')
# 提取內存剩余空間
mem_size=$(free | awk '/Mem/{print $4}')
while :
do
# 注意內存和磁盤提取的空間大小都是以 Kb 為單位
if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
then
mail ‐s "Warning" root <<EOF
Insufficient resources,資源不足
EOF
fi
done
6、猜數字游戲
#!/bin/bash # 腳本生成一個 100 以內的隨機數,提示用戶猜數字,根據用戶的輸入,提示用戶猜對了, # 猜小了或猜大了,直至用戶猜對腳本結束。 # RANDOM 為系統自帶的系統變量,值為 0‐32767的隨機數 # 使用取余算法將隨機數變為 1‐100 的隨機數 num=$[RANDOM%100+1] echo "$num" # 使用 read 提示用戶猜數字 # 使用 if 判斷用戶猜數字的大小關系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于), # ‐lt(小于),‐le(小于等于) while : do read -p "計算機生成了一個 1‐100 的隨機數,你猜: " cai if [ $cai -eq $num ] then echo "恭喜,猜對了" exit elif [ $cai -gt $num ] then echo "Oops,猜大了" else echo "Oops,猜小了" fi done
7、檢測本機當前用戶是否為超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員(使用字串對比版本)
#!/bin/bash # 檢測本機當前用戶是否為超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不 # 是,則提示您非管理員(使用字串對比版本) if [ $USER == "root" ] then yum ‐y install vsftpd else echo "您不是管理員,沒有權限安裝軟件" fi
8、檢測本機當前用戶是否為超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員(使用 UID 數字對比版本)
#!/bin/bash # 檢測本機當前用戶是否為超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不 # 是,則提示您非管理員(使用 UID 數字對比版本) if [ $UID -eq 0 ];then yum ‐y install vsftpd else echo "您不是管理員,沒有權限安裝軟件" fi
9、編寫腳本:提示用戶輸入用戶名和密碼,腳本自動創建相應的賬戶及配置密碼。如果用戶不輸入賬戶名,則提示必須輸入賬戶名并退出腳本;如果用戶不輸入密碼,則統一使用默認的 123456 作為默認密碼。
#!/bin/bash
# 編寫腳本:提示用戶輸入用戶名和密碼,腳本自動創建相應的賬戶及配置密碼。如果用戶
# 不輸入賬戶名,則提示必須輸入賬戶名并退出腳本;如果用戶不輸入密碼,則統一使用默
# 認的 123456 作為默認密碼。
read -p "請輸入用戶名: " user
#使用‐z 可以判斷一個變量是否為空,如果為空,提示用戶必須輸入賬戶名,并退出腳本,退出碼為 2
#沒有輸入用戶名腳本退出后,使用$?查看的返回碼為 2
if [ -z $user ];then
echo "您不需輸入賬戶名"
exit 2
fi
#使用 stty ‐echo 關閉 shell 的回顯功能
#使用 stty echo 打開 shell 的回顯功能
stty -echo
read -p "請輸入密碼: " pass
stty echo
pass=${pass:‐123456}
useradd "$user"
echo "$pass" | passwd ‐‐stdin "$user"
10、輸入三個數并進行升序排序
#!/bin/bash # 依次提示用戶輸入 3 個整數,腳本根據數字大小依次排序輸出 3 個數字 read -p "請輸入一個整數:" num1 read -p "請輸入一個整數:" num2 read -p "請輸入一個整數:" num3 # 不管誰大誰小,最后都打印 echo "$num1,$num2,$num3" # num1 中永遠存最小的值,num2 中永遠存中間值,num3 永遠存最大值 # 如果輸入的不是這樣的順序,則改變數的存儲順序,如:可以將 num1 和 num2 的值對調 tmp=0 # 如果 num1 大于 num2,就把 num1 和和 num2 的值對調,確保 num1 變量中存的是最小值 if [ $num1 -gt $num2 ];then tmp=$num1 num1=$num2 num2=$tmp fi # 如果 num1 大于 num3,就把 num1 和 num3 對調,確保 num1 變量中存的是最小值 if [ $num1 -gt $num3 ];then tmp=$num1 num1=$num3 num3=$tmp fi # 如果 num2 大于 num3,就把 num2 和 num3 對標,確保 num2 變量中存的是小一點的值 if [ $num2 -gt $num3 ];then tmp=$num2 num2=$num3 num3=$tmp fi echo "排序后數據(從小到大)為:$num1,$num2,$num3"
11、石頭、剪刀、布游戲
#!/bin/bash
# 編寫腳本,實現人機<石頭,剪刀,布>游戲
game=(石頭 剪刀 布)
num=$[RANDOM%3]
computer=${game[$num]}
# 通過隨機數獲取計算機的出拳
# 出拳的可能性保存在一個數組中,game[0],game[1],game[2]分別是 3 中不同的可能
echo "請根據下列提示選擇您的出拳手勢"
echo "1.石頭"
echo "2.剪刀"
echo "3.布"
read -p "請選擇 1‐3:" person
case $person in
1)
if [ $num -eq 0 ]
then
echo "平局"
elif [ $num -eq 1 ]
then
echo "你贏"
else
echo "計算機贏"
fi;;
2)
if [ $num -eq 0 ]
then
echo "計算機贏"
elif [ $num -eq 1 ]
then
echo "平局"
else
echo "你贏"
fi;;
3)
if [ $num -eq 0 ]
then
echo "你贏"
elif [ $num -eq 1 ]
then
echo "計算機贏"
else
echo "平局"
fi;;
*)
echo "必須輸入 1‐3 的數字"
esac
12、編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀態,哪些主機處于關機狀態(for 版本)
#!/bin/bash
# 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀態,哪些主機處于關機
# 狀態(for 版本)
for i in {1..254}
do
# 每隔0.3秒ping一次,一共ping2次,并以1毫秒為單位設置ping的超時時間
ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
if [ $? -eq 0 ];then
echo "192.168.4.$i is up"
else
echo "192.168.4.$i is down"
fi
done
13、編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀態,哪些主機處于關機狀態(while 版本)
#!/bin/bash # 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀態,哪些主機處于關機 # 狀態(while 版本) i=1 while [ $i -le 254 ] do ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null if [ $? -eq 0 ];then echo "192.168.4.$i is up" else echo "192.168.4.$i is down" fi let i++ done
14、編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀態,哪些主機處于關機狀態(多進程版)
#!/bin/bash
# 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀態,哪些主機處于關機
# 狀態(多進程版)
#定義一個函數,ping 某一臺主機,并檢測主機的存活狀態
myping(){
ping ‐c 2 ‐i 0.3 ‐W 1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {1..254}
do
myping 192.168.4.$i &
done
# 使用&符號,將執行的函數放入后臺執行
# 這樣做的好處是不需要等待ping第一臺主機的回應,就可以繼續并發ping第二臺主機,依次類推。
15、編寫腳本,顯示進度條
#!/bin/bash
# 編寫腳本,顯示進度條
jindu(){
while :
do
echo -n '#'
sleep 0.2
done
}
jindu &
cp -a $1 $2
killall $0
echo "拷貝完成"
VSole
網絡安全專家