Linux. shell編程習題集

1、編寫hello world腳本

  1. #!/bin/bash
  2. # 編寫hello world腳本
  3. echo "Hello World!"

2、通過位置變量創建 Linux 系統賬戶及密碼

  1. #!/bin/bash
  2. # 通過位置變量創建 Linux 系統賬戶及密碼
  3. #$1 是執行腳本的第一個參數,$2 是執行腳本的第二個參數
  4. useradd "$1"
  5. echo "$2" | passwd ‐‐stdin "$1"

3、備份日誌

  1. #!/bin/bash
  2. # 每週 5 使用 tar 命令備份/var/log 下的所有日誌文件
  3. # vim /root/logbak.sh
  4. # 編寫備份腳本,備份後的文件名包含日期標籤,防止後面的備份將前面的備份數據覆蓋
  5. # 注意 date 命令需要使用反引號括起來,反引號在鍵盤<tab>鍵上面
  6. tar -czf log-`date +%Y%m%d`.tar.gz /var/log
  7. # crontab ‐e #編寫計劃任務,執行備份腳本
  8. 00 03 * * 5 /root/logbak.sh

4、一鍵部署 LNMP(RPM 包版本)

  1. #!/bin/bash
  2. # 一鍵部署 LNMP(RPM 包版本)
  3. # 使用 yum 安裝部署 LNMP,需要提前配置好 yum 源,否則該腳本會失敗
  4. # 本腳本使用於 centos7.2 或 RHEL7.2
  5. yum ‐y install httpd
  6. yum ‐y install mariadb mariadb‐devel mariadb‐server
  7. yum ‐y install php php‐mysql
  8. systemctl start httpd mariadb
  9. systemctl enable httpd mariadb

5、監控內存和磁盤容量,小於給定值時報警

  1. #!/bin/bash
  2. # 實時監控本機內存和硬盤剩餘空間,剩餘內存小於500M、根分區剩餘空間小於1000M時,發送報警郵件給root管理員
  3. # 提取根分區剩餘空間
  4. disk_size=$(df / | awk '/\//{print $4}')
  5. # 提取內存剩餘空間
  6. mem_size=$(free | awk '/Mem/{print $4}')
  7. while :
  8. do
  9. # 注意內存和磁盤提取的空間大小都是以 Kb 爲單位
  10. if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
  11. then
  12. mail ‐s "Warning" root <<EOF
  13. Insufficient resources,資源不足
  14. EOF
  15. fi
  16. done

6、猜數字遊戲

  1. #!/bin/bash
  2. # 腳本生成一個 100 以內的隨機數,提示用戶猜數字,根據用戶的輸入,提示用戶猜對了,
  3. # 猜小了或猜大了,直至用戶猜對腳本結束。
  4. # RANDOM 爲系統自帶的系統變量,值爲 0‐32767的隨機數
  5. # 使用取餘算法將隨機數變爲 1‐100 的隨機數
  6. num=$[RANDOM%100+1]
  7. echo "$num"
  8. # 使用 read 提示用戶猜數字
  9. # 使用 if 判斷用戶猜數字的大小關係:‐eq(等於),‐ne(不等於),‐gt(大於),‐ge(大於等於),
  10. # ‐lt(小於),‐le(小於等於)
  11. while :
  12. do
  13. read -p "計算機生成了一個 1‐100 的隨機數,你猜: " cai
  14. if [ $cai -eq $num ]
  15. then
  16. echo "恭喜,猜對了"
  17. exit
  18. elif [ $cai -gt $num ]
  19. then
  20. echo "Oops,猜大了"
  21. else
  22. echo "Oops,猜小了"
  23. fi
  24. done

7、檢測本機當前用戶是否爲超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員(使用字串對比版本)

  1. #!/bin/bash
  2. # 檢測本機當前用戶是否爲超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不
  3. # 是,則提示您非管理員(使用字串對比版本)
  4. if [ $USER == "root" ]
  5. then
  6. yum ‐y install vsftpd
  7. else
  8. echo "您不是管理員,沒有權限安裝軟件"
  9. fi

8、檢測本機當前用戶是否爲超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員(使用 UID 數字對比版本)

  1. #!/bin/bash
  2. # 檢測本機當前用戶是否爲超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不
  3. # 是,則提示您非管理員(使用 UID 數字對比版本)
  4. if [ $UID -eq 0 ];then
  5. yum ‐y install vsftpd
  6. else
  7. echo "您不是管理員,沒有權限安裝軟件"
  8. fi

9、編寫腳本:提示用戶輸入用戶名和密碼,腳本自動創建相應的賬戶及配置密碼。如果用戶不輸入賬戶名,則提示必須輸入賬戶名並退出腳本;如果用戶不輸入密碼,則統一使用默認的 123456 作爲默認密碼。

  1. #!/bin/bash
  2. # 編寫腳本:提示用戶輸入用戶名和密碼,腳本自動創建相應的賬戶及配置密碼。如果用戶
  3. # 不輸入賬戶名,則提示必須輸入賬戶名並退出腳本;如果用戶不輸入密碼,則統一使用默
  4. # 認的 123456 作爲默認密碼。
  5. read -p "請輸入用戶名: " user
  6. #使用‐z 可以判斷一個變量是否爲空,如果爲空,提示用戶必須輸入賬戶名,並退出腳本,退出碼爲 2
  7. #沒有輸入用戶名腳本退出後,使用$?查看的返回碼爲 2
  8. if [ -z $user ];then
  9. echo "您不需輸入賬戶名"
  10. exit 2
  11. fi
  12. #使用 stty ‐echo 關閉 shell 的回顯功能
  13. #使用 stty echo 打開 shell 的回顯功能
  14. stty -echo
  15. read -p "請輸入密碼: " pass
  16. stty echo
  17. pass=${pass:‐123456}
  18. useradd "$user"
  19. echo "$pass" | passwd ‐‐stdin "$user"

10、輸入三個數並進行升序排序

  1. #!/bin/bash
  2. # 依次提示用戶輸入 3 個整數,腳本根據數字大小依次排序輸出 3 個數字
  3. read -p "請輸入一個整數:" num1
  4. read -p "請輸入一個整數:" num2
  5. read -p "請輸入一個整數:" num3
  6. # 不管誰大誰小,最後都打印 echo "$num1,$num2,$num3"
  7. # num1 中永遠存最小的值,num2 中永遠存中間值,num3 永遠存最大值
  8. # 如果輸入的不是這樣的順序,則改變數的存儲順序,如:可以將 num1 和 num2 的值對調
  9. tmp=0
  10. # 如果 num1 大於 num2,就把 num1 和和 num2 的值對調,確保 num1 變量中存的是最小值
  11. if [ $num1 -gt $num2 ];then
  12. tmp=$num1
  13. num1=$num2
  14. num2=$tmp
  15. fi
  16. # 如果 num1 大於 num3,就把 num1 和 num3 對調,確保 num1 變量中存的是最小值
  17. if [ $num1 -gt $num3 ];then
  18. tmp=$num1
  19. num1=$num3
  20. num3=$tmp
  21. fi
  22. # 如果 num2 大於 num3,就把 num2 和 num3 對標,確保 num2 變量中存的是小一點的值
  23. if [ $num2 -gt $num3 ];then
  24. tmp=$num2
  25. num2=$num3
  26. num3=$tmp
  27. fi
  28. echo "排序後數據(從小到大)爲:$num1,$num2,$num3"

11、石頭、剪刀、布遊戲

  1. #!/bin/bash
  2. # 編寫腳本,實現人機<石頭,剪刀,布>遊戲
  3. game=(石頭 剪刀 布)
  4. num=$[RANDOM%3]
  5. computer=${game[$num]}
  6. # 通過隨機數獲取計算機的出拳
  7. # 出拳的可能性保存在一個數組中,game[0],game[1],game[2]分別是 3 中不同的可能
  8. echo "請根據下列提示選擇您的出拳手勢"
  9. echo "1.石頭"
  10. echo "2.剪刀"
  11. echo "3.布"
  12. read -p "請選擇 1‐3:" person
  13. case $person in
  14. 1)
  15. if [ $num -eq 0 ]
  16. then
  17. echo "平局"
  18. elif [ $num -eq 1 ]
  19. then
  20. echo "你贏"
  21. else
  22. echo "計算機贏"
  23. fi;;
  24. 2)
  25. if [ $num -eq 0 ]
  26. then
  27. echo "計算機贏"
  28. elif [ $num -eq 1 ]
  29. then
  30. echo "平局"
  31. else
  32. echo "你贏"
  33. fi;;
  34. 3)
  35. if [ $num -eq 0 ]
  36. then
  37. echo "你贏"
  38. elif [ $num -eq 1 ]
  39. then
  40. echo "計算機贏"
  41. else
  42. echo "平局"
  43. fi;;
  44. *)
  45. echo "必須輸入 1‐3 的數字"
  46. esac

12、編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機狀態(for 版本)

  1. #!/bin/bash
  2. # 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機
  3. # 狀態(for 版本)
  4. for i in {1..254}
  5. do
  6. # 每隔0.3秒ping一次,一共ping2次,並以1毫秒爲單位設置ping的超時時間
  7. ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
  8. if [ $? -eq 0 ];then
  9. echo "192.168.4.$i is up"
  10. else
  11. echo "192.168.4.$i is down"
  12. fi
  13. done

13、編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機狀態(while 版本) 

  1. #!/bin/bash
  2. # 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機
  3. # 狀態(while 版本)
  4. i=1
  5. while [ $i -le 254 ]
  6. do
  7. ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
  8. if [ $? -eq 0 ];then
  9. echo "192.168.4.$i is up"
  10. else
  11. echo "192.168.4.$i is down"
  12. fi
  13. let i++
  14. done

14、編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機狀態(多進程版)

  1. #!/bin/bash
  2. # 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機
  3. # 狀態(多進程版)
  4. #定義一個函數,ping 某一臺主機,並檢測主機的存活狀態
  5. myping(){
  6. ping ‐c 2 ‐i 0.3 ‐W 1 $1 &>/dev/null
  7. if [ $? -eq 0 ];then
  8. echo "$1 is up"
  9. else
  10. echo "$1 is down"
  11. fi
  12. }
  13. for i in {1..254}
  14. do
  15. myping 192.168.4.$i &
  16. done
  17. # 使用&符號,將執行的函數放入後臺執行
  18. # 這樣做的好處是不需要等待ping第一臺主機的迴應,就可以繼續併發ping第二臺主機,依次類推。

15、編寫腳本,顯示進度條

  1. #!/bin/bash
  2. # 編寫腳本,顯示進度條
  3. jindu(){
  4. while :
  5. do
  6. echo -n '#'
  7. sleep 0.2
  8. done
  9. }
  10. jindu &
  11. cp -a $1 $2
  12. killall $0
  13. echo "拷貝完成"

16、進度條,動態時針版本;定義一個顯示進度的函數,屏幕快速顯示|  / ‐ \

  1. #!/bin/bash
  2. # 進度條,動態時針版本
  3. # 定義一個顯示進度的函數,屏幕快速顯示| / ‐ \
  4. rotate_line(){
  5. INTERVAL=0.5 #設置間隔時間
  6. COUNT="0" #設置4個形狀的編號,默認編號爲 0(不代表任何圖像)
  7. while :
  8. do
  9. COUNT=`expr $COUNT + 1` #執行循環,COUNT 每次循環加 1,(分別代表4種不同的形狀)
  10. case $COUNT in #判斷 COUNT 的值,值不一樣顯示的形狀就不一樣
  11. "1") #值爲 1 顯示‐
  12. echo -e '‐'"\b\c"
  13. sleep $INTERVAL
  14. ;;
  15. "2") #值爲 2 顯示\\,第一個\是轉義
  16. echo -e '\\'"\b\c"
  17. sleep $INTERVAL
  18. ;;
  19. "3") #值爲 3 顯示|
  20. echo -e "|\b\c"
  21. sleep $INTERVAL
  22. ;;
  23. "4") #值爲 4 顯示/
  24. echo -e "/\b\c"
  25. sleep $INTERVAL
  26. ;;
  27. *) #值爲其他時,將 COUNT 重置爲 0
  28. COUNT="0";;
  29. esac
  30. done
  31. }
  32. rotate_line

17、9*9 乘法表

  1. #!/bin/bash
  2. # 9*9 乘法表(編寫 shell 腳本,打印 9*9 乘法表)
  3. for i in `seq 9`
  4. do
  5. for j in `seq $i`
  6. do
  7. echo -n "$j*$i=$[i*j] "
  8. done
  9. echo
  10. done

18、使用死循環實時顯示 eth0 網卡發送的數據包流量

  1. #!/bin/bash
  2. # 使用死循環實時顯示 eth0 網卡發送的數據包流量
  3. while :
  4. do
  5. echo '本地網卡 eth0 流量信息如下: '
  6. ifconfig eth0 | grep "RX pack" | awk '{print $5}'
  7. ifconfig eth0 | grep "TX pack" | awk '{print $5}'
  8. sleep 1
  9. done

19、使用 user.txt 文件中的人員名單,在計算機中自動創建對應的賬戶並配置初始密碼本腳本執行,需要提前準備一個 user.txt 文件,該文件中包含有若干用戶名信息

  1. #!/bin/bash
  2. # 使用 user.txt 文件中的人員名單,在計算機中自動創建對應的賬戶並配置初始密碼
  3. # 本腳本執行,需要提前準備一個 user.txt 文件,該文件中包含有若干用戶名信息
  4. for i in `cat user.txt`
  5. do
  6. useradd $i
  7. echo "123456" | passwd ‐‐stdin $i
  8. done

20、編寫批量修改擴展名腳本

  1. #!/bin/bash
  2. # 編寫批量修改擴展名腳本,如批量將 txt 文件修改爲 doc 文件
  3. # 執行腳本時,需要給腳本添加位置參數
  4. # 腳本名 txt doc(可以將 txt 的擴展名修改爲 doc)
  5. # 腳本名 doc jpg(可以將 doc 的擴展名修改爲 jpg)
  6. for i in `ls *.$1`
  7. do
  8. mv $i ${i%.*}.$2
  9. done

21、使用 expect 工具自動交互密碼遠程其他主機安裝 httpd 軟件

  1. #!/bin/bash
  2. # 使用 expect 工具自動交互密碼遠程其他主機安裝 httpd 軟件
  3. # 刪除~/.ssh/known_hosts 後,ssh 遠程任何主機都會詢問是否確認要連接該主機
  4. rm ‐rf ~/.ssh/known_hosts
  5. expect <<EOF
  6. spawn ssh 192.168.4.254
  7. expect "yes/no" {send "yes\r"}
  8. # 根據自己的實際情況將密碼修改爲真實的密碼字串
  9. expect "password" {send "密碼\r"}
  10. expect "#" {send "yum ‐y install httpd\r"}
  11. expect "#" {send "exit\r"}
  12. EOF

22、一鍵部署 LNMP(源碼安裝版本)

  1. #!/bin/bash
  2. # 一鍵部署 LNMP(源碼安裝版本)
  3. menu()
  4. {
  5. clear
  6. echo " ##############‐‐‐‐Menu‐‐‐‐##############"
  7. echo "# 1. Install Nginx"
  8. echo "# 2. Install MySQL"
  9. echo "# 3. Install PHP"
  10. echo "# 4. Exit Program"
  11. echo " ########################################"
  12. }
  13. choice()
  14. {
  15. read -p "Please choice a menu[1‐9]:" select
  16. }
  17. install_nginx()
  18. {
  19. id nginx &>/dev/null
  20. if [ $? -ne 0 ];then
  21. useradd -s /sbin/nologin nginx
  22. fi
  23. if [ -f nginx‐1.8.0.tar.gz ];then
  24. tar -xf nginx‐1.8.0.tar.gz
  25. cd nginx‐1.8.0
  26. yum -y install gcc pcre‐devel openssl‐devel zlib‐devel make
  27. ./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
  28. make
  29. make install
  30. ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
  31. cd ..
  32. else
  33. echo "沒有 Nginx 源碼包"
  34. fi
  35. }
  36. install_mysql()
  37. {
  38. yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
  39. id mysql &>/dev/null
  40. if [ $? -ne 0 ];then
  41. useradd -s /sbin/nologin mysql
  42. fi
  43. if [ -f mysql‐5.6.25.tar.gz ];then
  44. tar -xf mysql‐5.6.25.tar.gz
  45. cd mysql‐5.6.25
  46. cmake .
  47. make
  48. make install
  49. /usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
  50. ‐‐basedir=/usr/local/mysql/
  51. chown -R root.mysql /usr/local/mysql
  52. chown -R mysql /usr/local/mysql/data
  53. /bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
  54. chmod +x /etc/init.d/mysqld
  55. /bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
  56. echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
  57. ldconfig
  58. echo 'PATH=\$PATH:/usr/local/mysql/bin/' >> /etc/profile
  59. export PATH
  60. else
  61. echo "沒有 mysql 源碼包"
  62. exit
  63. fi
  64. }
  65. install_php()
  66. {
  67. #安裝 php 時沒有指定啓動哪些模塊功能,如果的用戶可以根據實際情況自行添加額外功能如‐‐with‐gd 等
  68. yum -y install gcc libxml2‐devel
  69. if [ -f mhash‐0.9.9.9.tar.gz ];then
  70. tar -xf mhash‐0.9.9.9.tar.gz
  71. cd mhash‐0.9.9.9
  72. ./configure
  73. make
  74. make install
  75. cd ..
  76. if [ ! ‐f /usr/lib/libmhash.so ];then
  77. ln -s /usr/local/lib/libmhash.so /usr/lib/
  78. fi
  79. ldconfig
  80. else
  81. echo "沒有 mhash 源碼包文件"
  82. exit
  83. fi
  84. if [ -f libmcrypt‐2.5.8.tar.gz ];then
  85. tar -xf libmcrypt‐2.5.8.tar.gz
  86. cd libmcrypt‐2.5.8
  87. ./configure
  88. make
  89. make install
  90. cd ..
  91. if [ ! -f /usr/lib/libmcrypt.so ];then
  92. ln -s /usr/local/lib/libmcrypt.so /usr/lib/
  93. fi
  94. ldconfig
  95. else
  96. echo "沒有 libmcrypt 源碼包文件"
  97. exit
  98. fi
  99. if [ -f php‐5.4.24.tar.gz ];then
  100. tar -xf php‐5.4.24.tar.gz
  101. cd php‐5.4.24
  102. ./configure ‐‐prefix=/usr/local/php5 ‐‐with‐mysql=/usr/local/mysql ‐‐enable‐fpm ‐‐
  103. enable‐mbstring ‐‐with‐mcrypt ‐‐with‐mhash ‐‐with‐config‐file‐path=/usr/local/php5/etc ‐‐with‐
  104. mysqli=/usr/local/mysql/bin/mysql_config
  105. make && make install
  106. /bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
  107. /bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
  108. cd ..
  109. else
  110. echo "沒有 php 源碼包文件"
  111. exit
  112. fi
  113. }
  114. while :
  115. do
  116. menu
  117. choice
  118. case $select in
  119. 1)
  120. install_nginx
  121. ;;
  122. 2)
  123. install_mysql
  124. ;;
  125. 3)
  126. install_php
  127. ;;
  128. 4)
  129. exit
  130. ;;
  131. *)
  132. echo Sorry!
  133. esac
  134. done

23、編寫腳本快速克隆 KVM 虛擬機

  1. #!/bin/bash
  2. # 編寫腳本快速克隆 KVM 虛擬機
  3. # 本腳本針對 RHEL7.2 或 Centos7.2
  4. # 本腳本需要提前準備一個 qcow2 格式的虛擬機模板,
  5. # 名稱爲/var/lib/libvirt/images /.rh7_template 的虛擬機模板
  6. # 該腳本使用 qemu‐img 命令快速創建快照虛擬機
  7. # 腳本使用 sed 修改模板虛擬機的配置文件,將虛擬機名稱、UUID、磁盤文件名、MAC 地址
  8. # exit code:
  9. # 65 ‐> user input nothing
  10. # 66 ‐> user input is not a number
  11. # 67 ‐> user input out of range
  12. # 68 ‐> vm disk image exists
  13. IMG_DIR=/var/lib/libvirt/images
  14. BASEVM=rh7_template
  15. read -p "Enter VM number: " VMNUM
  16. if [ $VMNUM -le 9 ];then
  17. VMNUM=0$VMNUM
  18. fi
  19. if [ -z "${VMNUM}" ]; then
  20. echo "You must input a number."
  21. exit 65
  22. elif [[ ${VMNUM} =~ [a‐z] ]; then
  23. echo "You must input a number."
  24. exit 66
  25. elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then
  26. echo "Input out of range"
  27. exit 67
  28. fi
  29. NEWVM=rh7_node${VMNUM}
  30. if [ -e $IMG_DIR/${NEWVM}.img ]; then
  31. echo "File exists."
  32. exit 68
  33. fi
  34. echo -en "Creating Virtual Machine disk image......\t"
  35. qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null
  36. echo -e "\e[32;1m[OK]\e[0m"
  37. #virsh dumpxml ${BASEVM} > /tmp/myvm.xml
  38. cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml
  39. sed -i "/<name>${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
  40. sed -i "/uuid/s/<uuid>.*<\/uuid>/<uuid>$(uuidgen)<\/uuid>/" /tmp/myvm.xml
  41. sed -i "/${BASEVM}\.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
  42. # 修改 MAC 地址,本例使用的是常量,每位使用該腳本的用戶需要根據實際情況修改這些值
  43. # 最好這裏可以使用便利,這樣更適合於批量操作,可以克隆更多虛擬機
  44. sed -i "/mac /s/a1/0c/" /tmp/myvm.xml
  45. echo -en "Defining new virtual machine......\t\t"
  46. virsh define /tmp/myvm.xml &> /dev/null
  47. echo -e "\e[32;1m[OK]\e[0m"

24、點名器腳本

  1. #!/bin/bash
  2. # 編寫一個點名器腳本
  3. # 該腳本,需要提前準備一個 user.txt 文件
  4. # 該文件中需要包含所有姓名的信息,一行一個姓名,腳本每次隨機顯示一個姓名
  5. while :
  6. do
  7. #統計 user 文件中有多少用戶
  8. line=`cat user.txt |wc ‐l`
  9. num=$[RANDOM%line+1]
  10. sed -n "${num}p" user.txt
  11. sleep 0.2
  12. clear
  13. done

25、查看有多少遠程的 IP 在連接本機

  1. #!/bin/bash
  2. # 查看有多少遠程的 IP 在連接本機(不管是通過 ssh 還是 web 還是 ftp 都統計)
  3. # 使用 netstat ‐atn 可以查看本機所有連接的狀態,‐a 查看所有,
  4. # -t僅顯示 tcp 連接的信息,‐n 數字格式顯示
  5. # Local Address(第四列是本機的 IP 和端口信息)
  6. # Foreign Address(第五列是遠程主機的 IP 和端口信息)
  7. # 使用 awk 命令僅顯示第 5 列數據,再顯示第 1 列 IP 地址的信息
  8. # sort 可以按數字大小排序,最後使用 uniq 將多餘重複的刪除,並統計重複的次數
  9. netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c

26、對 100 以內的所有正整數相加求和(1+2+3+4...+100)

  1. #!/bin/bash
  2. # 對 100 以內的所有正整數相加求和(1+2+3+4...+100)
  3. #seq 100 可以快速自動生成 100 個整數
  4. sum=0
  5. for i in `seq 100`
  6. do
  7. sum=$[sum+i]
  8. done
  9. echo "總和是:$sum"

27、統計 13:30 到 14:30 所有訪問 apache 服務器的請求有多少個

  1. #!/bin/bash
  2. # 統計 13:30 到 14:30 所有訪問 apache 服務器的請求有多少個
  3. # awk 使用‐F 選項指定文件內容的分隔符是/或者:
  4. # 條件判斷$7:$8 大於等於 13:30,並且要求,$7:$8 小於等於 14:30
  5. # 最後使用 wc ‐l 統計這樣的數據有多少行,即多少個
  6. awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l

28、統計 13:30 到 14:30 所有訪問本機 Aapche 服務器的遠程 IP 地址是什麼 

  1. #!/bin/bash
  2. # 統計 13:30 到 14:30 所有訪問本機 Aapche 服務器的遠程 IP 地址是什麼
  3. # awk 使用‐F 選項指定文件內容的分隔符是/或者:
  4. # 條件判斷$7:$8 大於等於 13:30,並且要求,$7:$8 小於等於 14:30
  5. # 日誌文檔內容裏面,第 1 列是遠程主機的 IP 地址,使用 awk 單獨顯示第 1 列即可
  6. awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log

29、打印國際象棋棋盤

  1. #!/bin/bash
  2. # 打印國際象棋棋盤
  3. # 設置兩個變量,i 和 j,一個代表行,一個代表列,國際象棋爲 8*8 棋盤
  4. # i=1 是代表準備打印第一行棋盤,第 1 行棋盤有灰色和藍色間隔輸出,總共爲 8 列
  5. # i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
  6. # 棋盤的規律是 i+j 如果是偶數,就打印藍色色塊,如果是奇數就打印灰色色塊
  7. # 使用 echo ‐ne 打印色塊,並且打印完成色塊後不自動換行,在同一行繼續輸出其他色塊
  8. for i in {1..8}
  9. do
  10. for j in {1..8}
  11. do
  12. sum=$[i+j]
  13. if [ $[sum%2] -eq 0 ];then
  14. echo -ne "\033[46m \033[0m"
  15. else
  16. echo -ne "\033[47m \033[0m"
  17. fi
  18. done
  19. echo
  20. done

30、統計每個遠程 IP 訪問了本機 apache 幾次?

  1. #!/bin/bash
  2. # 統計每個遠程 IP 訪問了本機 apache 幾次?
  3. awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log

31、統計當前 Linux 系統中可以登錄計算機的賬戶有多少個

  1. #!/bin/bash
  2. # 統計當前 Linux 系統中可以登錄計算機的賬戶有多少個
  3. #方法 1:
  4. grep "bash$" /etc/passwd | wc -l
  5. #方法 2:
  6. awk -f: '/bash$/{x++}end{print x}' /etc/passwd

32、統計/var/log 有多少個文件,並顯示這些文件名

  1. #!/bin/bash
  2. # 統計/var/log 有多少個文件,並顯示這些文件名
  3. # 使用 ls 遞歸顯示所有,再判斷是否爲文件,如果是文件則計數器加 1
  4. cd /var/log
  5. sum=0
  6. for i in `ls -r *`
  7. do
  8. if [ -f $i ];then
  9. let sum++
  10. echo "文件名:$i"
  11. fi
  12. done
  13. echo "總文件數量爲:$sum"

33、自動爲其他腳本添加解釋器信息

  1. #!/bin/bash
  2. # 自動爲其他腳本添加解釋器信息#!/bin/bash,如腳本名爲 test.sh 則效果如下:
  3. # ./test.sh abc.sh 自動爲 abc.sh 添加解釋器信息
  4. # ./test.sh user.sh 自動爲 user.sh 添加解釋器信息
  5. # 先使用 grep 判斷對象腳本是否已經有解釋器信息,如果沒有則使用 sed 添加解釋器以及描述信息
  6. if ! grep -q "^#!" $1; then
  7. sed '1i #!/bin/bash' $1
  8. sed '2i #Description: '
  9. fi
  10. # 因爲每個腳本的功能不同,作用不同,所以在給對象腳本添加完解釋器信息,以及 Description 後還希望
  11. # 繼續編輯具體的腳本功能的描述信息,這裏直接使用 vim 把對象腳本打開,並且光標跳轉到該文件的第 2 行
  12. vim +2 $1

34、自動化部署 varnish 源碼包軟件

  1. #!/bin/bash
  2. # 自動化部署 varnish 源碼包軟件
  3. # 本腳本需要提前下載 varnish‐3.0.6.tar.gz 這樣一個源碼包軟件,該腳本即可用自動源碼安裝部署軟件
  4. yum -y install gcc readline‐devel pcre‐devel
  5. useradd -s /sbin/nologin varnish
  6. tar -xf varnish‐3.0.6.tar.gz
  7. cd varnish‐3.0.6
  8. # 使用 configure,make,make install 源碼安裝軟件包
  9. ./configure ‐‐prefix=/usr/local/varnish
  10. make && make install
  11. # 在源碼包目錄下,將相應的配置文件拷貝到 Linux 系統文件系統中
  12. # 默認安裝完成後,不會自動拷貝或安裝配置文件到 Linux 系統,所以需要手動 cp 複製配置文件
  13. # 並使用 uuidgen 生成一個隨機密鑰的配置文件
  14. cp redhat/varnish.initrc /etc/init.d/varnish
  15. cp redhat/varnish.sysconfig /etc/sysconfig/varnish
  16. cp redhat/varnish_reload_vcl /usr/bin/
  17. ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
  18. ln -s /usr/local/varnish/bin/* /usr/bin
  19. mkdir /etc/varnish
  20. cp /usr/local/varnish/etc/varnish/default.vcl /etc/varnish/
  21. uuidgen > /etc/varnish/secret

35、編寫 nginx 啓動腳本

  1. #!/bin/bash
  2. # 編寫 nginx 啓動腳本
  3. # 本腳本編寫完成後,放置在/etc/init.d/目錄下,就可以被 Linux 系統自動識別到該腳本
  4. # 如果本腳本名爲/etc/init.d/nginx,則 service nginx start 就可以啓動該服務
  5. # service nginx stop 就可以關閉服務
  6. # service nginx restart 可以重啓服務
  7. # service nginx status 可以查看服務狀態
  8. program=/usr/local/nginx/sbin/nginx
  9. pid=/usr/local/nginx/logs/nginx.pid
  10. start(){
  11. if [ -f $pid ];then
  12. echo "nginx 服務已經處於開啓狀態"
  13. else
  14. $program
  15. fi
  16. stop(){
  17. if [ -! -f $pid ];then
  18. echo "nginx 服務已經關閉"
  19. else
  20. $program -s stop
  21. echo "關閉服務 ok"
  22. fi
  23. }
  24. status(){
  25. if [ -f $pid ];then
  26. echo "服務正在運行..."
  27. else
  28. echo "服務已經關閉"
  29. fi
  30. }
  31. case $1 in
  32. start)
  33. start;;
  34. stop)
  35. stop;;
  36. restart)
  37. stop
  38. sleep 1
  39. start;;
  40. status)
  41. status;;
  42. *)
  43. echo "你輸入的語法格式錯誤"
  44. esac

36、自動對磁盤分區、格式化、掛載

  1. #!/bin/bash
  2. # 自動對磁盤分區、格式化、掛載
  3. # 對虛擬機的 vdb 磁盤進行分區格式化,使用<<將需要的分區指令導入給程序 fdisk
  4. # n(新建分區),p(創建主分區),1(分區編號爲 1),兩個空白行(兩個回車,相當於將整個磁盤分一個區)
  5. # 注意:1 後面的兩個回車(空白行)是必須的!
  6. fdisk /dev/vdb << EOF
  7. n
  8. p
  9. 1
  10. wq
  11. EOF
  12. #格式化剛剛創建好的分區
  13. mkfs.xfs /dev/vdb1
  14. #創建掛載點目錄
  15. if [ -e /data ]; then
  16. exit
  17. fi
  18. mkdir /data
  19. #自動掛載剛剛創建的分區,並設置開機自動掛載該分區
  20. echo '/dev/vdb1 /data xfs defaults 1 2' >> /etc/fstab
  21. mount -a

37、自動優化 Linux 內核參數

  1. #!/bin/bash
  2. # 自動優化 Linux 內核參數
  3. #腳本針對 RHEL7
  4. cat >> /usr/lib/sysctl.d/00‐system.conf <<EOF
  5. fs.file‐max=65535
  6. net.ipv4.tcp_timestamps = 0
  7. net.ipv4.tcp_synack_retries = 5
  8. net.ipv4.tcp_syn_retries = 5
  9. net.ipv4.tcp_tw_recycle = 1
  10. net.ipv4.tcp_tw_reuse = 1
  11. net.ipv4.tcp_fin_timeout = 30
  12. #net.ipv4.tcp_keepalive_time = 120
  13. net.ipv4.ip_local_port_range = 1024 65535
  14. kernel.shmall = 2097152
  15. kernel.shmmax = 2147483648
  16. kernel.shmmni = 4096
  17. kernel.sem = 5010 641280 5010 128
  18. net.core.wmem_default=262144
  19. net.core.wmem_max=262144
  20. net.core.rmem_default=4194304
  21. net.core.rmem_max=4194304
  22. net.ipv4.tcp_fin_timeout = 10
  23. net.ipv4.tcp_keepalive_time = 30
  24. net.ipv4.tcp_window_scaling = 0
  25. net.ipv4.tcp_sack = 0
  26. EOF
  27. sysctl –p

38、切割 Nginx 日誌文件(防止單個文件過大,後期處理很困難)

  1. #mkdir /data/scripts
  2. #vim /data/scripts/nginx_log.sh
  3. #!/bin/bash
  4. # 切割 Nginx 日誌文件(防止單個文件過大,後期處理很困難)
  5. logs_path="/usr/local/nginx/logs/"
  6. mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
  7. kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
  8. # chmod +x /data/scripts/nginx_log.sh
  9. # crontab ‐e #腳本寫完後,將腳本放入計劃任務每天執行一次腳本
  10. 0 1 * * * /data/scripts/nginx_log.sh

39、檢測 MySQL 數據庫連接數量

  1. #!/bin/bash
  2. # 檢測 MySQL 數據庫連接數量
  3. # 本腳本每 2 秒檢測一次 MySQL 併發連接數,可以將本腳本設置爲開機啓動腳本,或在特定時間段執行
  4. # 以滿足對 MySQL 數據庫的監控需求,查看 MySQL 連接是否正常
  5. # 本案例中的用戶名和密碼需要根據實際情況修改後方可使用
  6. log_file=/var/log/mysql_count.log
  7. user=root
  8. passwd=123456
  9. while :
  10. do
  11. sleep 2
  12. count=`mysqladmin -u "$user" -p "$passwd" status | awk '{print $4}'`
  13. echo "`date +%Y‐%m‐%d` 併發連接數爲:$count" >> $log_file
  14. done

40、根據 md5 校驗碼,檢測文件是否被修改

  1. #!/bin/bash
  2. # 根據 md5 校驗碼,檢測文件是否被修改
  3. # 本示例腳本檢測的是/etc 目錄下所有的 conf 結尾的文件,根據實際情況,您可以修改爲其他目錄或文件
  4. # 本腳本在目標數據沒有被修改時執行一次,當懷疑數據被人篡改,再執行一次
  5. # 將兩次執行的結果做對比,MD5 碼發生改變的文件,就是被人篡改的文件
  6. for i in $(ls /etc/*.conf)
  7. do
  8. md5sum "$i" >> /var/log/conf_file.log
  9. done

41、檢測 MySQL 服務是否存活

  1. #!/bin/bash
  2. # 檢測 MySQL 服務是否存活
  3. # host 爲你需要檢測的 MySQL 主機的 IP 地址,user 爲 MySQL 賬戶名,passwd 爲密碼
  4. # 這些信息需要根據實際情況修改後方可使用
  5. host=192.168.51.198
  6. user=root
  7. passwd=123456
  8. mysqladmin -h '$host' -u '$user' -p'$passwd' ping &>/dev/null
  9. if [ $? -eq 0 ]
  10. then
  11. echo "MySQL is UP"
  12. else
  13. echo "MySQL is down"
  14. fi

42、備份 MySQL 的 shell 腳本(mysqldump版本)

  1. #!/bin/bash
  2. # 備份 MySQL 的 shell 腳本(mysqldump版本)
  3. # 定義變量 user(數據庫用戶名),passwd(數據庫密碼),date(備份的時間標籤)
  4. # dbname(需要備份的數據庫名稱,根據實際需求需要修改該變量的值,默認備份 mysql 數據庫)
  5. user=root
  6. passwd=123456
  7. dbname=mysql
  8. date=$(date +%Y%m%d)
  9. # 測試備份目錄是否存在,不存在則自動創建該目錄
  10. [ ! -d /mysqlbackup ] && mkdir /mysqlbackup
  11. # 使用 mysqldump 命令備份數據庫
  12. mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql

43、將文件中所有的小寫字母轉換爲大寫字母

  1. #!/bin/bash
  2. # 將文件中所有的小寫字母轉換爲大寫字母
  3. # $1是位置參數,是你需要轉換大小寫字母的文件名稱
  4. # 執行腳本,給定一個文件名作爲參數,腳本就會將該文件中所有的小寫字母轉換爲大寫字母
  5. tr "[a‐z]" "[A‐Z]" < $1

44、非交互自動生成 SSH 密鑰文件

  1. #!/bin/bash
  2. # 非交互自動生成 SSH 密鑰文件
  3. # ‐t 指定 SSH 密鑰的算法爲 RSA 算法;‐N 設置密鑰的密碼爲空;‐f 指定生成的密鑰文件>存放在哪裏
  4. rm -rf ~/.ssh/{known_hosts,id_rsa*}
  5. ssh‐keygen -t RSA -N '' -f ~/.ssh/id_rsa

45、檢查特定的軟件包是否已經安裝

  1. #!/bin/bash
  2. # 檢查特定的軟件包是否已經安裝
  3. if [ $# -eq 0 ];then
  4. echo "你需要制定一個軟件包名稱作爲腳本參數"
  5. echo "用法:$0 軟件包名稱 ..."
  6. fi
  7. # $@提取所有的位置變量的值,相當於$*
  8. for package in "$@"
  9. do
  10. if rpm -q ${package} &>/dev/null ;then
  11. echo -e "${package}\033[32m 已經安裝\033[0m"
  12. else
  13. echo -e "${package}\033[34;1m 未安裝\033[0m"
  14. fi
  15. done

46、監控 HTTP 服務器的狀態(測試返回碼)

  1. #!/bin/bash
  2. # 監控 HTTP 服務器的狀態(測試返回碼)
  3. # 設置變量,url爲你需要檢測的目標網站的網址(IP 或域名),比如百度
  4. url=http://http://183.232.231.172/index.html
  5. # 定義函數 check_http:
  6. # 使用 curl 命令檢查 http 服務器的狀態
  7. # ‐m 設置curl不管訪問成功或失敗,最大消耗的時間爲 5 秒,5 秒連接服務爲相應則視爲無法連接
  8. # ‐s 設置靜默連接,不顯示連接時的連接速度、時間消耗等信息
  9. # ‐o 將 curl 下載的頁面內容導出到/dev/null(默認會在屏幕顯示頁面內容)
  10. # ‐w 設置curl命令需要顯示的內容%{http_code},指定curl返回服務器的狀態碼
  11. check_http()
  12. {
  13. status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} $url)
  14. }
  15. while :
  16. do
  17. check_http
  18. date=$(date +%Y%m%d‐%H:%M:%S)
  19. # 生成報警郵件的內容
  20. echo "當前時間爲:$date
  21. $url 服務器異常,狀態碼爲${status_code}.
  22. 請儘快排查異常." > /tmp/http$$.pid
  23. # 指定測試服務器狀態的函數,並根據返回碼決定是發送郵件報警還是將正常信息寫入日誌
  24. if [ $status_code -ne 200 ];then
  25. mail -s Warning root < /tmp/http$$.pid
  26. else
  27. echo "$url 連接正常" >> /var/log/http.log
  28. fi
  29. sleep 5
  30. done

47、自動添加防火牆規則,開啓某些服務或端口(適用於 RHEL7)

  1. #!/bin/bash
  2. # 自動添加防火牆規則,開啓某些服務或端口(適用於 RHEL7)
  3. #
  4. # 設置變量定義需要添加到防火牆規則的服務和端口號
  5. # 使用 firewall‐cmd ‐‐get‐services 可以查看 firewall 支持哪些服務
  6. service="nfs http ssh"
  7. port="80 22 8080"
  8. # 循環將每個服務添加到防火牆規則中
  9. for i in $service
  10. do
  11. echo "Adding $i service to firewall"
  12. firewall‐cmd --add-service=${i}
  13. done
  14. #循環將每個端口添加到防火牆規則中
  15. for i in $port
  16. do
  17. echo "Adding $i Port to firewall"
  18. firewall‐cmd --add-port=${i}/tcp
  19. done
  20. #將以上設置的臨時防火牆規則,轉換爲永久有效的規則(確保重啓後有效)
  21. firewall‐cmd --runtime-to-permanent

48、使用腳本自動創建邏輯卷

  1. #!/bin/bash
  2. # 使用腳本自動創建邏輯卷
  3. # 清屏,顯示警告信息,創建將磁盤轉換爲邏輯卷會刪除數據
  4. clear
  5. echo -e "\033[32m !!!!!!警告(Warning)!!!!!!\033[0m"
  6. echo
  7. echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
  8. echo "腳本會將整個磁盤轉換爲 PV,並刪除磁盤上所有數據!!!"
  9. echo "This Script will destroy all data on the Disk"
  10. echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
  11. echo
  12. read -p "請問是否繼續 y/n?:" sure
  13. # 測試用戶輸入的是否爲 y,如果不是則退出腳本
  14. [ $sure != y ] && exit
  15. # 提示用戶輸入相關參數(磁盤、卷組名稱等數據),並測試用戶是否輸入了這些值,如果沒有輸入,則腳本退出
  16. read -p "請輸入磁盤名稱,如/dev/vdb:" disk
  17. [ -z $disk ] && echo "沒有輸入磁盤名稱" && exit
  18. read -p "請輸入卷組名稱:" vg_name
  19. [ -z $vg_name ] && echo "沒有輸入卷組名稱" && exit
  20. read -p "請輸入邏輯卷名稱:" lv_name
  21. [ -z $lv_name ] && echo "沒有輸入邏輯卷名稱" && exit
  22. read -p "請輸入邏輯卷大小:" lv_size
  23. [ -z $lv_size ] && echo "沒有輸入邏輯卷大小" && exit
  24. # 使用命令創建邏輯卷
  25. pvcreate $disk
  26. vgcreate $vg_name $disk
  27. lvcreate -L ${lv_size}M -n ${lv_name} ${vg_name}

49、顯示 CPU 廠商信息

  1. #!/bin/bash
  2. # 顯示 CPU 廠商信息
  3. awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq

50、刪除某個目錄下大小爲 0 的文件

  1. #!/bin/bash
  2. # 刪除某個目錄下大小爲 0 的文件
  3. #/var/www/html 爲測試目錄,腳本會清空該目錄下所有 0 字節的文件
  4. dir="/var/www/html"
  5. find $dir -type f -size 0 -exec rm -rf {} \;

51、查找 Linux 系統中的殭屍進程

  1. #!/bin/bash
  2. # 查找 Linux 系統中的殭屍進程
  3. # awk 判斷 ps 命令輸出的第 8 列爲 Z 是,顯示該進程的 PID 和進程命令
  4. ps aux | awk '{if($8 == "Z"){print $2,$11}}'

52、提示用戶輸入年份後判斷該年是否爲閏年

  1. #!/bin/bash
  2. # 提示用戶輸入年份後判斷該年是否爲閏年
  3. # 能被4整除並且並不能被100整除的年份是閏年
  4. # 能被400整除的年份也是閏年
  5. read -p "請輸入一個年份:" year
  6. if [ "$year" = "" ];then
  7. echo "沒有輸入年份"
  8. exit

2、通過位置變量創建 Linux 系統賬戶及密碼

  1. #!/bin/bash
  2. # 通過位置變量創建 Linux 系統賬戶及密碼
  3. #$1 是執行腳本的第一個參數,$2 是執行腳本的第二個參數
  4. useradd "$1"
  5. echo "$2" | passwd ‐‐stdin "$1"

3、備份日誌

  1. #!/bin/bash
  2. # 每週 5 使用 tar 命令備份/var/log 下的所有日誌文件
  3. # vim /root/logbak.sh
  4. # 編寫備份腳本,備份後的文件名包含日期標籤,防止後面的備份將前面的備份數據覆蓋
  5. # 注意 date 命令需要使用反引號括起來,反引號在鍵盤<tab>鍵上面
  6. tar -czf log-`date +%Y%m%d`.tar.gz /var/log
  7. # crontab ‐e #編寫計劃任務,執行備份腳本
  8. 00 03 * * 5 /root/logbak.sh

4、一鍵部署 LNMP(RPM 包版本)

  1. #!/bin/bash
  2. # 一鍵部署 LNMP(RPM 包版本)
  3. # 使用 yum 安裝部署 LNMP,需要提前配置好 yum 源,否則該腳本會失敗
  4. # 本腳本使用於 centos7.2 或 RHEL7.2
  5. yum ‐y install httpd
  6. yum ‐y install mariadb mariadb‐devel mariadb‐server
  7. yum ‐y install php php‐mysql
  8. systemctl start httpd mariadb
  9. systemctl enable httpd mariadb

5、監控內存和磁盤容量,小於給定值時報警

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