Linux shell程式設計100例

2020-08-09 00:01:09

版權宣告:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處鏈接和本宣告。

本文鏈接:https://blog.csdn.net/yugemengjing/article/details/82469785

 

 

1、編寫hello world指令碼

  1. #!/bin/bash
  2.  
  3. # 編寫hello world指令碼
  4.  
  5. echo "Hello World!"

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

  1. #!/bin/bash
  2.  
  3. # 通過位置變數建立 Linux 系統賬戶及密碼
  4.  
  5. #$1 是執行指令碼的第一個參數,$2 是執行指令碼的第二個參數
  6. useradd    "$1"
  7. 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.  
  8. # crontab ‐e  #編寫計劃任務,執行備份指令碼
  9. 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.  
  9. systemctl start httpd mariadb
  10. systemctl enable httpd mariadb

5、監控記憶體和磁碟容量,小於給定值時報警

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

6、猜數位遊戲

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

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

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

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

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

9、編寫指令碼:提示使用者輸入使用者名稱和密碼,指令碼自動建立相應的賬戶及設定密碼。如果使用者不輸入賬戶名,則提示必須輸入賬戶名並退出指令碼;如果使用者不輸入密碼,則統一使用預設的 123456 作爲預設密碼。

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

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

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

11、石頭、剪刀、布遊戲

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

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

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

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

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

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

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

15、編寫指令碼,顯示進度條

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

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

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

17、9*9 乘法表

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

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

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

19、使用 user.txt 檔案中的人員名單,在計算機中自動建立對應的賬戶並設定初始密碼本指令碼執行,需要提前準備一個 user.txt 檔案,該檔案中包含有若幹使用者名稱資訊

  1. #!/bin/bash
  2.  
  3. # 使用 user.txt 檔案中的人員名單,在計算機中自動建立對應的賬戶並設定初始密碼
  4. # 本指令碼執行,需要提前準備一個 user.txt 檔案,該檔案中包含有若幹使用者名稱資訊
  5. for i in `cat user.txt`
  6. do
  7.        useradd  $i
  8.        echo "123456" | passwd ‐‐stdin $i
  9. done

20、編寫批次修改擴充套件名指令碼

  1. #!/bin/bash
  2.  
  3. # 編寫批次修改擴充套件名指令碼,如批次將 txt 檔案修改爲 doc 檔案
  4. # 執行指令碼時,需要給指令碼新增位置參數
  5. # 指令碼名  txt  doc(可以將 txt 的擴充套件名修改爲 doc)
  6. # 指令碼名  doc  jpg(可以將 doc 的擴充套件名修改爲 jpg)
  7.  
  8. for i in `ls *.$1`
  9. do
  10.         mv $i ${i%.*}.$2
  11. done

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

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

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

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

23、編寫指令碼快速克隆 KVM 虛擬機器

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

24、點名器指令碼

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

25、檢視有多少遠端的 IP 在連線本機

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

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

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

27、統計 13:30 到 14:30 所有存取 apache 伺服器的請求有多少個

  1. #!/bin/bash
  2.  
  3. # 統計 13:30 14:30 所有存取 apache 伺服器的請求有多少個
  4.  
  5. # awk 使用‐F 選項指定檔案內容的分隔符是/或者:
  6. # 條件判斷$7:$8 大於等於 13:30,並且要求,$7:$8 小於等於 14:30
  7. # 最後使用 wc ‐l 統計這樣的數據有多少行,即多少個
  8. 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.  
  3. # 統計 13:30 14:30 所有存取本機 Aapche 伺服器的遠端 IP 地址是什麼
  4. # awk 使用‐F 選項指定檔案內容的分隔符是/或者:
  5. # 條件判斷$7:$8 大於等於 13:30,並且要求,$7:$8 小於等於 14:30
  6. # 日誌文件內容裏面, 1 列是遠端主機的 IP 地址,使用 awk 單獨顯示第 1 列即可
  7. awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log

29、列印國際象棋棋盤

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

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

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

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

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

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

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

33、自動爲其他指令碼新增直譯器資訊

  1. #!/bin/bash
  2.  
  3. # 自動爲其他指令碼新增直譯器資訊#!/bin/bash,如指令碼名爲 test.sh 則效果如下:
  4. # ./test.sh  abc.sh  自動爲 abc.sh 新增直譯器資訊
  5. # ./test.sh  user.sh 自動爲 user.sh 新增直譯器資訊
  6.  
  7. # 先使用 grep 判斷物件指令碼是否已經有直譯器資訊,如果沒有則使用 sed 新增直譯器以及描述資訊
  8. if  !  grep  -q  "^#!"  $1; then
  9. sed  '1i #!/bin/bash'  $1
  10. sed  '2i #Description: '
  11. fi
  12. # 因爲每個指令碼的功能不同,作用不同,所以在給物件指令碼新增完直譯器資訊,以及 Description 後還希望
  13. # 繼續編輯具體的指令碼功能的描述資訊,這裏直接使用 vim 把物件指令碼開啓,並且遊標跳轉到該檔案的第 2
  14. vim +2 $1

34、自動化部署 varnish 原始碼包軟體

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

35、編寫 nginx 啓動指令碼

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

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

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

37、自動優化 Linux 內核參數

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

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

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

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

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

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

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

41、檢測 MySQL 服務是否存活

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

42、備份 MySQL 的 shell 指令碼(mysqldump版本)

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

43、將檔案中所有的小寫字母轉換爲大寫字母

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

44、非互動自動生成 SSH 金鑰檔案

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

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

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

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

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

47、自動新增防火牆規則,開啓某些服務或埠(適用於 RHEL7)

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

48、使用指令碼自動建立邏輯卷

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

49、顯示 CPU 廠商資訊

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

50、刪除某個目錄下大小爲 0 的檔案

  1. #!/bin/bash
  2.  
  3. # 刪除某個目錄下大小爲 0 的檔案
  4.  
  5. #/var/www/html 爲測試目錄,指令碼會清空該目錄下所有 0 位元組的檔案
  6. dir="/var/www/html"
  7. find $dir -type f -size 0 -exec rm -rf {} \;

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

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

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

  1. #!/bin/bash
  2.  
  3. # 提示使用者輸入年份後判斷該年是否爲閏年
  4.  
  5. # 能被4整除並且並不能被100整除的年份是閏年
  6. # 能被400整除的年份也是閏年
  7. read -p "請輸入一個年份:" year
  8.  
  9. if [ "$year" = "" ];then
  10.     echo "沒有輸入年份"
  11.     exit
  12. fi
  13. #使用正則測試變數 year 中是否包含大小寫字母
  14. if [[ "$year" =~ [a‐Z] ]];then
  15.     echo "你輸入的不是數位"
  16.     exit
  17. fi
  18. # 判斷是否爲閏年
  19. if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ];then
  20.     echo "$year年是閏年" 
  21. elif [ $[year % 400] -eq 0 ];then
  22.     echo "$year年是閏年"
  23. else
  24.     echo "$year年不是閏年"
  25. fi

53、生成隨機密碼(urandom 版本)

  1. #!/bin/bash
  2.  
  3. # 生成隨機密碼(urandom 版本)
  4.  
  5. # /dev/urandom 檔案是 Linux 內建的隨機裝置檔案
  6. # cat /dev/urandom 可以看看裏面的內容,ctrl+c 退出檢視
  7. # 檢視該檔案內容後,發現內容有些太隨機,包括很多特殊符號,我們需要的密碼不希望使用這些符號
  8. # tr ‐dc '_A‐Za‐z0‐9' < /dev/urandom
  9. # 該命令可以將隨機檔案中其他的字元刪除,僅保留大小寫字母,數位,下劃線,但是內容還是太多
  10. # 我們可以繼續將優化好的內容通過管道傳遞給 head 命令,在大量數據中僅顯示頭 10 個位元組
  11. # 注意 A 前面有個下劃線
  12. tr -dc '_A‐Za‐z0‐9' </dev/urandom | head -c 10

54、生成隨機密碼(字串擷取版本)

  1. #!/bin/bash
  2.  
  3. # 生成隨機密碼(字串擷取版本)
  4.  
  5. # 設定變數 key,儲存密碼的所有可能性(密碼庫),如果還需要其他字元請自行新增其他密碼字元
  6. # 使用$#統計密碼庫的長度
  7. key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  8. num=${#key}
  9. # 設定初始密碼爲空
  10. pass=''
  11. # 回圈 8 ,生成隨機密碼
  12. # 每次都是亂數對密碼庫的長度取餘,確保提取的密碼字元不超過密碼庫的長度
  13. # 每次回圈提取一位隨機密碼,並將該隨機密碼追加到 pass 變數的最後
  14. for i in {1..8}
  15. do 
  16.   index=$[RANDOM%num]
  17.   pass=$pass${key:$index:1}
  18. done
  19. echo $pass

55、生成隨機密碼(UUID 版本,16 進位制密碼)

  1. #!/bin/bash
  2.  
  3. # 生成隨機密碼(UUID 版本,16 進位制密碼)
  4. uuidgen

56、生成隨機密碼(進程 ID 版本,數位密碼)

  1. #!/bin/bash
  2.  
  3. # 生成隨機密碼(進程 ID 版本,數位密碼)
  4. echo $$

57、測試使用者名稱與密碼是否正確

  1. #!/bin/bash
  2.  
  3. # 測試使用者名稱與密碼是否正確
  4.  
  5. #使用者名稱爲 tom 並且密碼爲 123456,則提示登錄成功,否則提示登錄失敗
  6. read -p "請輸入使用者名稱:"  user
  7. read -p "請輸入密碼:"    pass
  8. if [ "$user" == 'tom' -a "$pass" == '123456' ];then
  9.        echo "Login successful"
  10. else
  11.         echo "Login Failed"
  12. fi

58、回圈測試使用者名稱與密碼是否正確

  1. #!/bin/bash
  2.  
  3. # 回圈測試使用者名稱與密碼是否正確
  4.  
  5. # 回圈測試使用者的賬戶名和密碼,最大測試 3 ,輸入正確提示登錄成功,否則提示登錄失敗
  6. # 使用者名稱爲 tom 並且密碼爲 123456 
  7. for i in {1..3}
  8. do
  9.        read -p "請輸入使用者名稱:" user
  10.         read -p "請輸入密碼:"   pass
  11. if [ "$user" == 'tom' -a "$pass" == '123456' ];then
  12.         echo "Login successful"
  13.         exit
  14. fi
  15. done
  16. echo "Login Failed"

59、Shell 指令碼的 fork 炸彈

  1. #!/bin/bash
  2.  
  3. # Shell 指令碼的 fork 炸彈
  4.  
  5. # 快速消耗計算機資源,致使計算機宕機
  6. # 定義函數名爲.(), 函數中遞回呼叫自己並放入後臺執行
  7. .() { .|.& };.

60、批次下載有序檔案(pdf、圖片、視訊等等)

  1. #!/bin/bash
  2.  
  3. # 批次下載有序檔案(pdf、圖片、視訊等等)
  4.  
  5. # 本指令碼準備有序的網路資料進行批次下載操作( 01.jpg,02.jpg,03.jpg)
  6. # 設定資源來源的域名連線
  7. url="http://www.baidu.com/"
  8. echo  "開始下載..."
  9. sleep 2
  10. type=jpg
  11. for i in `seq 100`
  12.         echo "正在下載$i.$type"
  13.         curl $url/$i.$type -o /tmp/${i}$type
  14.         sleep 1
  15. done
  16. #curl 使用-o 選項指定下載檔案另存到哪裏.

61、顯示當前計算機中所有賬戶的使用者名稱稱

  1.  #!/bin/bash
  2.  
  3. # 顯示當前計算機中所有賬戶的使用者名稱稱
  4.  
  5. # 下面 下麪使用3種不同的方式列出計算機中所有賬戶的使用者名稱
  6. # 指定以:爲分隔符,列印/etc/passwd 檔案的第 1
  7. awk -F: '{print $1}' /etc/passwd
  8.  
  9. # 指定以:爲分隔符,列印/etc/passwd 檔案的第 1
  10. cut -d: -f1 /etc/passwd
  11.  
  12. # 使用 sed 的替換功能,/etc/passwd 檔案中:後面的所有內容替換爲空(僅顯示使用者名稱)
  13. sed 's/:.*//' /etc/passwd

62、制定目錄路徑,指令碼自動將該目錄使用 tar 命令打包備份到/data目錄

  1. #!/bin/bash
  2.  
  3. # 制定目錄路徑,指令碼自動將該目錄使用 tar 命令打包備份到/data目錄
  4.  
  5. [ ! -d /data ] && mkdir /data
  6. [ -z $1 ] && exit
  7. if [ -d $1 ];then
  8.        tar -czf /data/$1.-`date +%Y%m%d`.tar.gz $1
  9. else
  10.         echo "該目錄不存在"
  11. fi

63、顯示進度條(迴旋鏢版)

  1. #!/bin/bash
  2.  
  3. # 顯示進度條(迴旋鏢版)
  4.  
  5. while :
  6. do
  7.        clear
  8.        for i in {1..20}
  9.        do
  10.                echo ‐e "\033[3;${i}H*"
  11.                sleep 0.1
  12.         done
  13.         clear
  14.         for i in {20..1}
  15.         do
  16.                echo ‐e "\033[3;${i}H*"
  17.                sleep 0.1
  18.         done
  19.         clear
  20. done

64、安裝 LAMP 環境(yum 版本)

  1. #!/bin/bash
  2.  
  3. # 安裝 LAMP 環境(yum 版本)
  4.  
  5. # 本指令碼適用於 RHEL7(RHEL6 中數據庫爲 mysql)
  6. yum makecache &>/dev/null
  7. num=$(yum repolist | awk '/repolist/{print $2}' | sed 's/,//')
  8. if [ $num -lt 0 ];then
  9.        yum -y install httpd
  10.         yum -y install mariadb mariadb-server mariadb-devel
  11.         yum -y install php php-mysql
  12. else
  13.         echo "未設定 yum ..."
  14. fi

65、回圈關閉區域網中所有主機

  1. #!/bin/bash
  2.  
  3. # 回圈關閉區域網中所有主機
  4.  
  5. # 假設本機爲 192.168.4.100,編寫指令碼關閉除自己外的其他所有主機
  6. # 指令碼執行,需要提前給所有其他主機傳遞 ssh 金鑰,滿足無密碼連線
  7. for i in {1..254}
  8. do
  9.        [ $i -eq 100 ] && continue
  10.         echo "正在關閉 192.168.4.$i..."
  11.         ssh 192.168.4.$i poweroff
  12. done

66、獲取本機 MAC 地址

  1. #!/bin/bash
  2.  
  3. # 獲取本機 MAC 地址
  4. ip a s | awk 'BEGIN{print  " MAC :"}/^[0‐9]/{print $2;getline;if($0~/link\/ether/){print $2}}' | grep -v lo:
  5.  
  6. # awk 讀取 ip 命令的輸出,輸出結果中如果有以數位開始的行,先顯示該行的地 2 (網絡卡名稱),
  7. # 接着使用 getline 再讀取它的下一行數據,判斷是否包含 link/ether
  8. # 如果保護該關鍵詞,就顯示該行的第 2 (MAC 地址)
  9. # lo 迴環裝置沒有 MAC,因此將其遮蔽,不顯示

67、自動設定 rsynd 伺服器的組態檔 rsyncd.conf

  1. #!/bin/bash
  2.  
  3. # 自動設定 rsynd 伺服器的組態檔 rsyncd.conf
  4.  
  5. # See rsyncd.conf man page for more options.
  6.  
  7. [ ! -d /home/ftp ] && mkdir /home/ftp
  8. echo 'uid = nobody
  9. gid = nobody
  10. use chroot = yes
  11. max connections = 4
  12. pid file = /var/run/rsyncd.pid
  13. exclude = lost+found/
  14. transfer logging = yes
  15. timeout = 900
  16. ignore nonreadable = yes
  17. dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
  18. [ftp]
  19.     path = /home/ftp
  20.     comment = share' > /etc/rsyncd.conf

68、修改 Linux 系統的最大開啓檔案數量

  1. #!/bin/bash
  2.  
  3. # 修改 Linux 系統的最大開啓檔案數量
  4.  
  5. # /etc/security/limits.conf 檔案的末尾追加兩行設定參數,修改最大開啓檔案數量爲 65536
  6. cat >> /etc/security/limits.conf <<EOF
  7. * soft nofile  65536
  8. * hard nofile  65536
  9. EOF

69、設定 Python 支援自動命令補齊功能

  1. #!/bin/bash
  2.  
  3. # 設定 Python 支援自動命令補齊功能
  4.  
  5. # Summary:Enable tab complete for python
  6. # Description:
  7.  
  8. Needs import readline and rlcompleter module
  9. #
  10. import readline
  11. #
  12. import rlcompleter
  13. #
  14. help(rlcompleter) display detail: readline.parse_and_bind('tab: complete')
  15. #
  16. man python display detail: PYTHONSTARTUP variable
  17.  
  18. if  [ ! -f /usr/bin/tab.py ];then
  19.         cat >> /usr/bin/tab.py <<EOF
  20. import readline
  21. import rlcompleter
  22. readline.parse_and_bind('tab: complete')
  23. EOF
  24. fi
  25. sed  -i '$a export PYTHONSTARTUP=/usr/bin/tab.py' /etc/profile
  26. source /etc/profile

70、自動修改計劃任務組態檔

  1. #!/bin/bash
  2.  
  3. # 自動修改計劃任務組態檔
  4.  
  5. read -p "請輸入分鐘資訊(00‐59):" min
  6. read -p "請輸入小時資訊(00‐24):" hour
  7. read -p "請輸入日期資訊(01‐31):" date
  8. read -p "請輸入月份資訊(01‐12):" month
  9. read -p "請輸入星期資訊(00‐06):" weak
  10. read -p "請輸入計劃任務需要執行的命令或指令碼:" program
  11. echo "$min $hour $date $month $weak $program" >> /etc/crontab

71、使用指令碼回圈建立三位數位的文字檔案(111-999 的檔案)

  1. #!/bin/bash
  2.  
  3. # 使用指令碼回圈建立三位數位的文字檔案(111-999 的檔案)
  4.  
  5. for i in {1..9}
  6. do
  7.        for j in {1..9}
  8.        do
  9.               for k in {1..9}
  10.                do
  11.                        touch /tmp/$i$j$k.txt
  12.                done
  13.         done
  14. done

72、找出/etc/passwd 中能登錄的使用者,並將對應在/etc/shadow 中第二列密碼提出處理

  1. #!/bin/bash
  2.  
  3. # 找出/etc/passwd 中能登錄的使用者,並將對應在/etc/shadow 中第二列密碼提出處理
  4.  
  5. user=$(awk -F: '/bash$/{print $1}' /etc/passwd)
  6. for i in $user
  7. do
  8.        awk -F: -v x=$i '$1==x{print $1,$2}' /etc/shadow
  9. done

73、統計/etc/passwd 中 root 出現的次數

  1. #!/bin/bash
  2.  
  3. # 統計/etc/passwd root 出現的次數
  4.  
  5. #每讀取一行檔案內容,即從第 1 列回圈到最後 1 ,依次判斷是否包含 root 關鍵詞,如果包含則 x++
  6. awk -F: '{i=1;while(i<=NF){if($i~/root/){x++};i++}} END{print "root 出現次數爲"x}' /etc/passwd

74、統計 Linux 進程相關數量資訊

  1. #!/bin/bash
  2.  
  3. # 統計 Linux 進程相關數量資訊
  4.  
  5. running=0
  6. sleeping=0
  7. stoped=0
  8. zombie=0
  9. # proc 目錄下所有以數位開始的都是當前計算機正在執行的進程的進程 PID
  10. # 每個 PID 編號的目錄下記錄有該進程相關的資訊
  11. for pid in /proc/[1‐9]*
  12. do
  13.         procs=$[procs+1]
  14.         stat=$(awk '{print $3}' $pid/stat)
  15. # 每個 pid 目錄下都有一個 stat 檔案,該檔案的第 3 列是該進程的狀態資訊
  16.         case $stat in
  17.         R)
  18.                running=$[running+1]
  19.                ;;
  20.         T)
  21.                stoped=$[stoped+1]
  22.                ;;
  23.         S)
  24.                sleeping=$[sleeping+1]
  25.                ;;
  26.         Z)
  27.                zombie=$[zombie+1]
  28.                ;;
  29.         esac
  30. done
  31. echo "進程統計資訊如下"
  32. echo "總進程數量爲:$procs"
  33. echo "Running 進程數爲:$running"
  34. echo "Stoped 進程數爲:$stoped"
  35. echo "Sleeping 進程數爲:$sleeping"
  36. echo "Zombie 進程數爲:$zombie"

75、從鍵盤讀取一個論壇積分,判斷論壇使用者等級

  1. #!/bin/bash
  2.  
  3. # 從鍵盤讀取一個論壇積分,判斷論壇使用者等級
  4.  
  5. #等級分類如下:
  6. 大於等於 90                         神功絕世
  7. 大於等於 80,小於 90       登峯造極
  8. 大於等於 70,小於 80       爐火純青
  9. 大於等於 60,小於 70       略有小成
  10. 小於 60                              初學乍練
  11. read -p "請輸入積分(0‐100):" JF
  12. if [ $JF -ge 90 ] ; then
  13.         echo "$JF ,神功絕世"
  14. elif [ $JF -ge 80 ] ; then
  15.     echo "$JF ,登峯造極"
  16. elif [ $JF -ge 70 ] ; then
  17.     echo "$JF ,爐火純青"
  18. elif [ $JF -lt 60 ] ; then
  19.     echo "$JF ,略有小成"
  20. else
  21.     echo "$JF ,初學乍練"
  22. fi

76、判斷使用者輸入的數據型別(字母、數位或其他) 

  1. #!/bin/bash
  2.  
  3. # 判斷使用者輸入的數據型別(字母、數位或其他)
  4. read -p "請輸入一個字元:" KEY
  5. case "$KEY" in
  6.        [a‐z]|[A‐Z])
  7.               echo "字母"
  8.               ;;
  9.        [0‐9])
  10.                echo "數位"
  11.                ;;
  12.         *)
  13.                echo "空格、功能鍵或其他控制字元"
  14. esac

77、顯示進度條(數位版) 

  1. #!/bin/bash
  2.  
  3. # 顯示進度條(數位版)
  4. # echo 使用‐e 選項後,在列印參數中可以指定 H,設定需要列印內容的 x,y 軸的定位座標
  5. # 設定需要列印內容在第幾行,第幾列
  6. for i in {1..100}
  7. do
  8.        echo -e "\033[6;8H["
  9.        echo -e "\033[6;9H$i%"
  10.         echo -e "\033[6;13H]"
  11.         sleep 0.1
  12. done

78、列印斐波那契數列

  1. #!/bin/bash
  2.  
  3. # 列印斐波那契數列(該數列的特點是後一個數字,永遠都是前 2 個數字之和)
  4.  
  5. # 斐波那契數列後一個數字永遠是前 2 個數字之和
  6. # :0  1  1  2  3  5  8  13 ... ...
  7. list=(0 1)
  8. for i in `seq 2 11`
  9. do
  10.         list[$i]=`expr ${list[‐1]} + ${list[‐2]}`
  11. done
  12. echo ${list[@]}

79、判斷使用者輸入的是 Yes 或 NO

  1. #!/bin/bash
  2.  
  3. # 判斷使用者輸入的是 Yes NO
  4.  
  5. read -p  "Are you sure?[y/n]:"  sure
  6. case  $sure  in
  7.        y|Y|Yes|YES) 
  8.               echo "you enter $a"
  9.               ;;
  10.     n|N|NO|no)
  11.                echo "you enter $a"
  12.                ;;
  13.     *)
  14.                echo "error";;
  15. esac

80、顯示本機 Linux 系統上所有開放的埠列表

  1. #!/bin/bash
  2.  
  3. # 顯示本機 Linux 系統上所有開放的埠列表
  4.  
  5. # 從埠列表中觀測有沒有沒用的埠,有的話可以將該埠對應的服務關閉,防止意外的攻擊可能性
  6. ss -nutlp | awk '{print $1,$5}' | awk -F"[: ]" '{print "協定:"$1,"埠號:"$NF}' | grep "[0‐9]" | uniq

81、將 Linux 系統中 UID 大於等於 1000 的普通使用者都刪除

  1. #!/bin/bash
  2.  
  3. # Linux 系統中 UID 大於等於 1000 的普通使用者都刪除
  4.  
  5. # 先用 awk 提取所有 uid 大於等於 1000 的普通使用者名稱稱
  6. # 再使用 for 回圈逐個將每個使用者刪除即可
  7. user=$(awk -F: '$3>=1000{print $1}' /etc/passwd)
  8. for i in $user
  9. do
  10.         userdel -r $i
  11. done

82、使用指令碼開啓關閉虛擬機器

  1. #!/bin/bash
  2.  
  3. # 使用指令碼開啓關閉虛擬機器
  4.  
  5. # 指令碼通過呼叫virsh命令實現對虛擬機器的管理,如果沒有該命令,需要安裝 libvirt‐client 軟體包
  6. # $1是指令碼的第1個參數,$2是指令碼的第2個參數
  7. # 1個參數是你希望對虛擬機器進行的操作指令,2個參數是虛擬機器名稱
  8. case $1 in
  9.   list)
  10.     virsh list --all
  11.     ;;
  12.   start)
  13.     virsh start $2
  14.     ;;
  15.   stop)
  16.     virsh destroy $2
  17.     ;;
  18.   enable)
  19.     virsh autostart $2
  20.     ;;
  21.   disable)
  22.     virsh autostart --disable $2
  23.     ;;
  24.   *)
  25.     echo "Usage:$0 list"
  26.     echo "Usage:$0 [start|stop|enable|disable]  VM_name"
  27.     cat << EOF
  28.     #list      顯示虛擬機器列表
  29.     #start     啓動虛擬機器
  30.     #stop      關閉虛擬機器
  31.     #enable    設定虛擬機器爲開機自啓
  32.     #disable   關閉虛擬機器開機自啓功能
  33.     EOF
  34.     ;;
  35. esac

83、調整虛擬機器記憶體參數的 shell 指令碼 

  1. #!/bin/bash
  2.  
  3. # 調整虛擬機器記憶體參數的 shell 指令碼
  4.  
  5. # 指令碼通過呼叫 virsh 命令實現對虛擬機器的管理,如果沒有該命令,需要安裝 libvirt‐client 軟體包
  6. cat << EOF
  7. 1.調整虛擬機器最大記憶體數值
  8. 2.調整實際分配給虛擬機器的記憶體數值
  9. EOF
  10. read -p "請選擇[1‐2]:" select
  11. case $select in
  12.         1)
  13.                 read -p "請輸入虛擬機器名稱" name
  14.                 read -p "請輸入最大記憶體數值(單位:k):" size
  15.                 virsh setmaxmem $name --size $size --config
  16.                 ;;
  17.         2)
  18.                 read -p "請輸入虛擬機器名稱" name
  19.                 read -p "請輸入實際分配記憶體數值(單位:k):" size
  20.                 virsh setmem $name $size
  21.                 ;;
  22.         *)
  23.                 echo "Error"
  24.                 ;;
  25. esac

84、檢視 KVM 虛擬機器中的網絡卡資訊(不需要進入啓動或進入虛擬機器) 

  1. #!/bin/bash
  2.  
  3. # 檢視 KVM 虛擬機器中的網絡卡資訊(不需要進入啓動或進入虛擬機器)
  4.  
  5. # 該指令碼使用 guestmount 工具,可以將虛擬機器的磁碟系統掛載到真實機檔案系統中
  6. # Centos7.2 中安裝 libguestfs‐tools‐c 可以獲得 guestmount 工具
  7. # 虛擬機器可以啓動或者不啓動都不影響該指令碼的使用
  8. # 將虛擬機器磁碟檔案掛載到檔案系統後,就可以直接讀取磁碟檔案中的網絡卡組態檔中的數據
  9. clear
  10. mountpoint="/media/virtimage"
  11. [ ! -d $mountpoint ] && mkdir $mountpoint
  12. read -p "輸入虛擬機器名稱:" name
  13. echo "請稍後..."
  14. # 如果有裝置掛載到該掛載點,則先 umount 解除安裝
  15. if mount | grep -q "$mountpoint" ;then
  16.         umount $mountpoint
  17. fi
  18. # 只讀的方式,將虛擬機器的磁碟檔案掛載到特定的目錄下,這裏是/media/virtimage 目錄
  19. guestmount -r -d $name -i $mountpoint
  20. echo
  21. echo "‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐"
  22. echo -e "\033[32m$name 虛擬機器中網絡卡列表如下:\033[0m"
  23. dev=$(ls /media/virtimage/etc/sysconfig/network‐scripts/ifcfg-* |awk -F"[/‐]" '{print $9}')
  24. echo $dev
  25. echo "‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐"
  26. echo
  27. echo
  28. echo "+++++++++++++++++++++++++++++++++++++++++++"
  29. echo -e "\033[32m 網絡卡 IP 地址資訊如下:\033[0m"
  30. for i in $dev
  31. do
  32.   echo -n "$i:"
  33.   grep -q "IPADDR" /media/virtimage/etc/sysconfig/network‐scripts/ifcfg-$i || echo "未設定 IP地址"
  34.   awk -F= '/IPADDR/{print $2}' /media/virtimage/etc/sysconfig/network-scripts/ifcfg-$i
  35. done
  36. echo "+++++++++++++++++++++++++++++++++++++++++++"

85、不登陸虛擬機器,修改虛擬機器網絡卡 IP 地址

  1. #!/bin/bash
  2.  
  3. # 不登陸虛擬機器,修改虛擬機器網絡卡 IP 地址
  4.  
  5. # 該指令碼使用 guestmount 工具,Centos7.2 中安裝 libguestfs‐tools‐c 可以獲得 guestmount 工具
  6. # 指令碼在不登陸虛擬機器的情況下,修改虛擬機器的 IP 地址資訊
  7. # 在某些環境下,虛擬機器沒有 IP IP 地址與真實主機不在一個網段
  8. # 真實主機在沒有 virt‐manger 圖形的情況下,遠端連線虛擬機器很麻煩
  9. # 該指令碼可以解決類似的問題
  10. read -p "請輸入虛擬機器名稱:" name
  11. if virsh domstate $name | grep -q running ;then
  12.         echo "修改虛擬機器網絡卡數據,需要關閉虛擬機器"
  13.         virsh destroy $name
  14. fi
  15. mountpoint="/media/virtimage"
  16. [ ! -d $mountpoint ] && mkdir $mountpoint
  17. echo "請稍後..."
  18. if mount | grep -q "$mountpoint" ;then
  19.         umount $mountpoint
  20. fi
  21. guestmount  -d $name -i $mountpoint
  22. read -p "請輸入需要修改的網絡卡名稱:" dev
  23. read -p "請輸入 IP 地址:" addr
  24. # 判斷原本網絡卡組態檔中是否有 IP 地址,有就修改該 IP,沒有就新增一個新的 IP 地址
  25. if grep -q "IPADDR"  $mountpoint/etc/sysconfig/network‐scripts/ifcfg‐$dev ;then
  26.         sed -i "/IPADDR/s/=.*/=$addr/"  $mountpoint/etc/sysconfig/network‐scripts/ifcfg‐$dev
  27. else
  28.         echo "IPADDR=$addr" >> $mountpoint/etc/sysconfig/network‐scripts/ifcfg‐$dev
  29. fi
  30. # 如果網絡卡組態檔中有客戶設定的 IP 地址,則指令碼提示修改 IP 完成
  31. awk -F= -v x=$addr '$2==x{print "完成..."}'  $mountpoint/etc/sysconfig/network‐scripts/ifcfg-$dev

86、破解虛擬機器密碼,無密碼登陸虛擬機器系統

  1. #!/bin/bash
  2.  
  3. # 破解虛擬機器密碼,無密碼登陸虛擬機器系統
  4.  
  5. # 該指令碼使用 guestmount 工具,Centos7.2 中安裝 libguestfs‐tools‐c 可以獲得 guestmount 工具
  6.  
  7. read -p "請輸入虛擬機器名稱:" name
  8. if virsh domstate $name | grep -q running ;then
  9.        echo "破解,需要關閉虛擬機器"
  10.         virsh destroy $name
  11. fi
  12. mountpoint="/media/virtimage"
  13. [ ! -d $mountpoint ] && mkdir $mountpoint
  14. echo "請稍後..."
  15. if mount | grep -q "$mountpoint" ;then
  16.         umount $mountpoint
  17. fi
  18. guestmount -d $name -i $mountpoint
  19. # passwd 中密碼佔位符號 x 刪除,該賬戶即可實現無密碼登陸系統
  20. sed -i "/^root/s/x//" $mountpoint/etc/passwd

87、Shell 指令碼對信號的處理,執行指令碼後,按鍵盤 Ctrl+C 無法終止的指令碼

  1. #!/bin/bash
  2.  
  3. # Shell 指令碼對信號的處理,執行指令碼後,按鍵盤 Ctrl+C 無法終止的指令碼
  4.  
  5. # 使用 trap 命令可以攔截使用者通過鍵盤或 kill 命令發送過來的信號
  6. # 使用 kill ‐l 可以檢視 Linux 系統中所有的信號列表,其中 2 代表 Ctrl+C
  7. # trap 當發現有使用者 ctrl+C 希望終端指令碼時,就執行 echo "暫停 10s";sleep 10 這兩條命令
  8. # 另外使用者使用命令:[ kill ‐2 指令碼的 PID ] 也可以中斷指令碼和 Ctrl+C 一樣的效果,都會被 trap 攔截
  9. trap 'echo "暫停 10s";sleep 10' 2
  10. while :
  11. do
  12.         echo "go go go"
  13. done

88、一鍵部署 memcached

  1. #!/bin/bash
  2.  
  3. # 一鍵部署 memcached
  4.  
  5. # 指令碼用原始碼來安裝 memcached 伺服器
  6. # 注意:如果軟體的下載鏈接過期了,請更新 memcached 的下載鏈接
  7. wget http://www.memcached.org/files/memcached-1.5.1.tar.gz
  8. yum -y install gcc
  9. tar -xf  memcached‐1.5.1.tar.gz
  10. cd memcached‐1.5.1
  11. ./configure
  12. make
  13. make install

89、一鍵設定 VNC 遠端桌面伺服器(無密碼版本)

  1. #!/bin/bash
  2.  
  3. # 一鍵設定 VNC 遠端桌面伺服器(無密碼版本)
  4.  
  5. # 指令碼設定的 VNC 伺服器,用戶端無需密碼即可連線
  6. # 用戶端僅有檢視遠端桌面的許可權,沒有滑鼠和鍵盤的操作許可權
  7.  
  8. rpm --quiet -q tigervnc‐server
  9. if [  $? -ne  0 ];then
  10.         yum  -y  tigervnc‐server
  11. fi
  12. x0vncserver AcceptKeyEvents=0 AlwaysShared=1 \
  13. AcceptPointerEvents=0 SecurityTypes=None  rfbport=5908

90、關閉 SELinux

  1. #!/bin/bash
  2.  
  3. # 關閉 SELinux
  4.  
  5. sed -i  '/^SELINUX/s/=.*/=disabled/' /etc/selinux/config
  6. setenforce 0

91、檢視所有虛擬機器磁碟使用量以及CPU使用量資訊

  1. #!/bin/bash
  2.  
  3. # 檢視所有虛擬機器磁碟使用量以及CPU使用量資訊
  4.  
  5. virt‐df
  6. read -n1 "按任意鍵繼續" key
  7. virt‐top

92、使用 shell 指令碼列印圖形

  1. #!/bin/bash
  2.  
  3. # 使用 shell 指令碼列印如下圖形:
  4.  
  5. # 列印第一組圖片
  6. # for(())爲類 C 語言的語法格式,也可以使用 for i  in;do  ;done 的格式替換
  7. # for((i=1;i<=9;i++))回圈會執行 9 ,i 1 開始到 9,每回圈一次 i 自加 1
  8. clear
  9. for (( i=1; i<=9; i++ ))
  10. do
  11.   for (( j=1; j<=i; j++ ))
  12.   do
  13.     echo -n "$i"
  14.   done
  15.   echo ""
  16. done
  17. read  -n1  "按任意鍵繼續"  key
  18. #列印第二組圖片
  19. clear
  20. for (( i=1; i<=5; i++ ))
  21. do
  22.   for (( j=1; j<=i; j++ ))
  23.   do
  24.     echo -n " |"
  25.   done
  26.   echo "_ "
  27. done
  28. read  -n1  "按任意鍵繼續"  key
  29. #列印第三組圖片
  30. clear
  31. for (( i=1; i<=5; i++ ))
  32. do
  33.   for (( j=1; j<=i; j++ ))
  34.   do
  35.     echo -n " *"
  36.   done
  37.   echo ""
  38. done
  39. for (( i=5; i>=1; i‐‐ ))
  40. do
  41.   for (( j=1; j<=i; j++ ))
  42.   do
  43.     echo -n " *"
  44.   done
  45.   echo ""
  46. done

93、根據計算機當前時間,返回問候語,可以將該指令碼設定爲開機啓動

  1. #!/bin/bash
  2.  
  3. # 根據計算機當前時間,返回問候語,可以將該指令碼設定爲開機啓動
  4.  
  5. # 00‐12 點爲早晨,12‐18 點爲下午,18‐24 點爲晚上
  6. # 使用 date 命令獲取時間後,if 判斷時間的區間,確定問候語內容
  7. tm=$(date +%H)
  8. if [ $tm -le 12 ];then
  9.        msg="Good Morning $USER"
  10. elif [ $tm -gt 12 -a $tm -le 18 ];then
  11.         msg="Good Afternoon $USER"
  12. else
  13.         msg="Good Night $USER"
  14. fi
  15. echo "當前時間是:$(date +"%Y‐%m‐%d %H:%M:%S")"
  16. echo -e "\033[34m$msg\033[0m"

94、讀取使用者輸入的賬戶名稱,將賬戶名寫入到陣列儲存

  1. #!/bin/bash
  2.  
  3. # 讀取使用者輸入的賬戶名稱,將賬戶名寫入到陣列儲存
  4.  
  5. # 定義陣列名稱爲 name,陣列的下標爲 i,小標從 0 開始,每輸入一個賬戶名,下標加 1,繼續存下一個賬戶
  6. # 最後,輸入 over,指令碼輸出總結性資訊後腳本退出
  7. i=0
  8. while :
  9. do
  10.         read -p "請輸入賬戶名,輸入 over 結束:" key
  11.         if [ $key == "over" ];then
  12.                break
  13.         else
  14.                name[$i]=$key
  15.                let i++
  16.         fi
  17. done
  18. echo "總賬戶名數量:${#name[*]}"
  19. echo "${name[@]}"

95、判斷檔案或目錄是否存在

  1. #!/bin/bash
  2.  
  3. # 判斷檔案或目錄是否存在
  4.  
  5. if [ $# -eq 0 ] ;then
  6. echo "未輸入任何參數,請輸入參數"
  7. echo "用法:$0 [檔名|目錄名]"
  8. fi
  9. if [ -f $1 ];then
  10.         echo "該檔案,存在"
  11.         ls -l $1
  12. else
  13.         echo "沒有該檔案"
  14. fi
  15. if [ -d  $1 ];then
  16.         echo "該目錄,存在"
  17.         ls -ld  $2
  18. else
  19.         echo "沒有該目錄"
  20. fi

96、列印各種格式的時間

  1. #!/bin/bash
  2.  
  3. # 列印各種時間格式
  4.  
  5. echo "顯示星期簡稱(:Sun)"
  6. date +%a
  7. echo "顯示星期全稱(:Sunday)"
  8. date +%A
  9. echo "顯示月份簡稱(:Jan)"
  10. date +%b
  11. echo "顯示月份全稱(:January)"
  12. date +%B
  13. echo "顯示數位月份(:12)"
  14. date +%m
  15. echo "顯示數位日期(:01 )"
  16. date +%d
  17. echo "顯示數位年(:01 )"
  18. date +%Y echo "顯示年"
  19. date +%F
  20. echo "顯示小時(24 小時制)"
  21. date +%H
  22. echo "顯示分鐘(00..59)"
  23. date +%M
  24. echo "顯示秒"
  25. date +%S
  26. echo "顯示納秒"
  27. date +%N
  28. echo "組合顯示"
  29. date +"%Y%m%d %H:%M:%S"

97、使用 egrep 過濾 MAC 地址

  1. #!/bin/bash
  2.  
  3. # 使用 egrep 過濾 MAC 地址
  4.  
  5. # MAC 地址由 16 進位制組成, AA:BB:CC:DD:EE:FF
  6. # [0‐9a‐fA‐F]{2}表示一段十六進制數值,{5}表示連續出現5組前置:的十六進制
  7. egrep "[0‐9a‐fA‐F]{2}(:[0‐9a‐fA‐F]{2}){5}" $1

98、統計雙色球各個數位的中獎概率

  1. #!/bin/bash
  2.  
  3. # 統計雙色球各個數位的中獎概率
  4.  
  5. # 往期雙色球中獎號碼如下:
  6. # 01 04 11 28 31 32  16
  7. # 04 07 08 18 23 24  02
  8. # 02 05 06 16 28 29  04
  9. # 04 19 22 27 30 33  01
  10. # 05 10 18 19 30 31  03
  11. # 02 06 11 12 19 29  06
  12. # 統計籃球和紅球數據出現的概率次數(籃球不分順序,統計所有籃球混合在一起的概率)
  13. awk '{print $1"\n"$2"\n"$3"\n"$4"\n"$5"\n"$6}' 1.txt | sort | uniq -c | sort
  14. awk '{print $7}' 1.txt | sort | uniq -c | sort

99、生成簽名私鑰和證書

  1. #!/bin/bash
  2.  
  3. # 生成簽名私鑰和證書
  4.  
  5. read -p "請輸入存放證書的目錄:" dir
  6. if [ ! -d $dir ];then
  7.        echo "該目錄不存在"
  8.        exit
  9. fi
  10. read -p "請輸入金鑰名稱:" name
  11. # 使用 openssl 生成私鑰
  12. openssl genrsa -out ${dir}/${name}.key
  13. # 使用 openssl 生成證書 #subj 選項可以在生成證書時,非互動自動填寫 Common Name 資訊
  14. openssl req -new -x509 -key ${dir}/${name}.key -subj "/CN=common" -out ${dir}/${name}.crt

100、使用awk編寫的wc程式

  1. #!/bin/bash
  2.  
  3. # 使用awk編寫的wc程式
  4.  
  5. # 自定義變數 chars 變數儲存字元個數,自定義變數 words 變數儲存單詞個數
  6. # awk 內建變數 NR 儲存行數
  7. # length() awk 內建函數,用來統計每行的字元數量,因爲每行都會有一個隱藏的$,所以每次統計後都+1
  8. # wc 程式會把檔案結尾符$也統計在內,可以使用 cat ‐A 檔名,檢視該隱藏字元
  9. awk '{chars+=length($0)+1;words+=NF} END{print NR,words,chars}' $1

注:本篇文章是根據王森的部落格整理而來,僅供學習參考!