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 "拷貝完成"
16、進度條,動態時針版本;定義一個顯示進度的函數,屏幕快速顯示| / ‐ \
- #!/bin/bash
- # 進度條,動態時針版本
- # 定義一個顯示進度的函數,屏幕快速顯示| / ‐ \
- rotate_line(){
- INTERVAL=0.5 #設置間隔時間
- COUNT="0" #設置4個形狀的編號,默認編號爲 0(不代表任何圖像)
- while :
- do
- COUNT=`expr $COUNT + 1` #執行循環,COUNT 每次循環加 1,(分別代表4種不同的形狀)
- case $COUNT in #判斷 COUNT 的值,值不一樣顯示的形狀就不一樣
- "1") #值爲 1 顯示‐
- echo -e '‐'"\b\c"
- sleep $INTERVAL
- ;;
- "2") #值爲 2 顯示\\,第一個\是轉義
- echo -e '\\'"\b\c"
- sleep $INTERVAL
- ;;
- "3") #值爲 3 顯示|
- echo -e "|\b\c"
- sleep $INTERVAL
- ;;
- "4") #值爲 4 顯示/
- echo -e "/\b\c"
- sleep $INTERVAL
- ;;
- *) #值爲其他時,將 COUNT 重置爲 0
- COUNT="0";;
- esac
- done
- }
- rotate_line
17、9*9 乘法表
- #!/bin/bash
- # 9*9 乘法表(編寫 shell 腳本,打印 9*9 乘法表)
- for i in `seq 9`
- do
- for j in `seq $i`
- do
- echo -n "$j*$i=$[i*j] "
- done
- echo
- done
18、使用死循環實時顯示 eth0 網卡發送的數據包流量
- #!/bin/bash
- # 使用死循環實時顯示 eth0 網卡發送的數據包流量
-
- while :
- do
- echo '本地網卡 eth0 流量信息如下: '
- ifconfig eth0 | grep "RX pack" | awk '{print $5}'
- ifconfig eth0 | grep "TX pack" | awk '{print $5}'
- sleep 1
- done
19、使用 user.txt 文件中的人員名單,在計算機中自動創建對應的賬戶並配置初始密碼本腳本執行,需要提前準備一個 user.txt 文件,該文件中包含有若干用戶名信息
- #!/bin/bash
- # 使用 user.txt 文件中的人員名單,在計算機中自動創建對應的賬戶並配置初始密碼
- # 本腳本執行,需要提前準備一個 user.txt 文件,該文件中包含有若干用戶名信息
- for i in `cat user.txt`
- do
- useradd $i
- echo "123456" | passwd ‐‐stdin $i
- done
20、編寫批量修改擴展名腳本
- #!/bin/bash
- # 編寫批量修改擴展名腳本,如批量將 txt 文件修改爲 doc 文件
- # 執行腳本時,需要給腳本添加位置參數
- # 腳本名 txt doc(可以將 txt 的擴展名修改爲 doc)
- # 腳本名 doc jpg(可以將 doc 的擴展名修改爲 jpg)
-
- for i in `ls *.$1`
- do
- mv $i ${i%.*}.$2
- done
21、使用 expect 工具自動交互密碼遠程其他主機安裝 httpd 軟件
- #!/bin/bash
- # 使用 expect 工具自動交互密碼遠程其他主機安裝 httpd 軟件
-
- # 刪除~/.ssh/known_hosts 後,ssh 遠程任何主機都會詢問是否確認要連接該主機
- rm ‐rf ~/.ssh/known_hosts
- expect <<EOF
- spawn ssh 192.168.4.254
-
- expect "yes/no" {send "yes\r"}
- # 根據自己的實際情況將密碼修改爲真實的密碼字串
- expect "password" {send "密碼\r"}
- expect "#" {send "yum ‐y install httpd\r"}
- expect "#" {send "exit\r"}
- EOF
22、一鍵部署 LNMP(源碼安裝版本)
- #!/bin/bash
- # 一鍵部署 LNMP(源碼安裝版本)
- menu()
- {
- clear
- echo " ##############‐‐‐‐Menu‐‐‐‐##############"
- echo "# 1. Install Nginx"
- echo "# 2. Install MySQL"
- echo "# 3. Install PHP"
- echo "# 4. Exit Program"
- echo " ########################################"
- }
-
- choice()
- {
- read -p "Please choice a menu[1‐9]:" select
- }
-
- install_nginx()
- {
- id nginx &>/dev/null
- if [ $? -ne 0 ];then
- useradd -s /sbin/nologin nginx
- fi
- if [ -f nginx‐1.8.0.tar.gz ];then
- tar -xf nginx‐1.8.0.tar.gz
- cd nginx‐1.8.0
- yum -y install gcc pcre‐devel openssl‐devel zlib‐devel make
- ./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
- make
- make install
- ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
- cd ..
- else
- echo "沒有 Nginx 源碼包"
- fi
- }
-
- install_mysql()
- {
- yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
- id mysql &>/dev/null
- if [ $? -ne 0 ];then
- useradd -s /sbin/nologin mysql
- fi
- if [ -f mysql‐5.6.25.tar.gz ];then
- tar -xf mysql‐5.6.25.tar.gz
- cd mysql‐5.6.25
- cmake .
- make
- make install
- /usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
- ‐‐basedir=/usr/local/mysql/
- chown -R root.mysql /usr/local/mysql
- chown -R mysql /usr/local/mysql/data
- /bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
- chmod +x /etc/init.d/mysqld
- /bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
- echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
- ldconfig
- echo 'PATH=\$PATH:/usr/local/mysql/bin/' >> /etc/profile
- export PATH
- else
- echo "沒有 mysql 源碼包"
- exit
- fi
- }
-
- install_php()
- {
- #安裝 php 時沒有指定啓動哪些模塊功能,如果的用戶可以根據實際情況自行添加額外功能如‐‐with‐gd 等
- yum -y install gcc libxml2‐devel
- if [ -f mhash‐0.9.9.9.tar.gz ];then
- tar -xf mhash‐0.9.9.9.tar.gz
- cd mhash‐0.9.9.9
- ./configure
- make
- make install
- cd ..
- if [ ! ‐f /usr/lib/libmhash.so ];then
- ln -s /usr/local/lib/libmhash.so /usr/lib/
- fi
- ldconfig
- else
- echo "沒有 mhash 源碼包文件"
- exit
- fi
- if [ -f libmcrypt‐2.5.8.tar.gz ];then
- tar -xf libmcrypt‐2.5.8.tar.gz
- cd libmcrypt‐2.5.8
- ./configure
- make
- make install
- cd ..
- if [ ! -f /usr/lib/libmcrypt.so ];then
- ln -s /usr/local/lib/libmcrypt.so /usr/lib/
- fi
- ldconfig
- else
- echo "沒有 libmcrypt 源碼包文件"
- exit
- fi
- if [ -f php‐5.4.24.tar.gz ];then
- tar -xf php‐5.4.24.tar.gz
- cd php‐5.4.24
- ./configure ‐‐prefix=/usr/local/php5 ‐‐with‐mysql=/usr/local/mysql ‐‐enable‐fpm ‐‐
- enable‐mbstring ‐‐with‐mcrypt ‐‐with‐mhash ‐‐with‐config‐file‐path=/usr/local/php5/etc ‐‐with‐
- mysqli=/usr/local/mysql/bin/mysql_config
- make && make install
- /bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
- /bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
- cd ..
- else
- echo "沒有 php 源碼包文件"
- exit
- fi
- }
-
- while :
- do
- menu
- choice
- case $select in
- 1)
- install_nginx
- ;;
- 2)
- install_mysql
- ;;
- 3)
- install_php
- ;;
- 4)
- exit
- ;;
- *)
- echo Sorry!
- esac
- done
23、編寫腳本快速克隆 KVM 虛擬機
- #!/bin/bash
- # 編寫腳本快速克隆 KVM 虛擬機
-
- # 本腳本針對 RHEL7.2 或 Centos7.2
- # 本腳本需要提前準備一個 qcow2 格式的虛擬機模板,
- # 名稱爲/var/lib/libvirt/images /.rh7_template 的虛擬機模板
- # 該腳本使用 qemu‐img 命令快速創建快照虛擬機
- # 腳本使用 sed 修改模板虛擬機的配置文件,將虛擬機名稱、UUID、磁盤文件名、MAC 地址
- # exit code:
- # 65 ‐> user input nothing
- # 66 ‐> user input is not a number
- # 67 ‐> user input out of range
- # 68 ‐> vm disk image exists
-
- IMG_DIR=/var/lib/libvirt/images
- BASEVM=rh7_template
- read -p "Enter VM number: " VMNUM
- if [ $VMNUM -le 9 ];then
- VMNUM=0$VMNUM
- fi
-
- if [ -z "${VMNUM}" ]; then
- echo "You must input a number."
- exit 65
- elif [[ ${VMNUM} =~ [a‐z] ]; then
- echo "You must input a number."
- exit 66
- elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then
- echo "Input out of range"
- exit 67
- fi
-
- NEWVM=rh7_node${VMNUM}
-
- if [ -e $IMG_DIR/${NEWVM}.img ]; then
- echo "File exists."
- exit 68
- fi
-
- echo -en "Creating Virtual Machine disk image......\t"
- qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null
-
- echo -e "\e[32;1m[OK]\e[0m"
-
- #virsh dumpxml ${BASEVM} > /tmp/myvm.xml
- cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml
- sed -i "/<name>${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
- sed -i "/uuid/s/<uuid>.*<\/uuid>/<uuid>$(uuidgen)<\/uuid>/" /tmp/myvm.xml
- sed -i "/${BASEVM}\.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
-
- # 修改 MAC 地址,本例使用的是常量,每位使用該腳本的用戶需要根據實際情況修改這些值
- # 最好這裏可以使用便利,這樣更適合於批量操作,可以克隆更多虛擬機
- sed -i "/mac /s/a1/0c/" /tmp/myvm.xml
-
- echo -en "Defining new virtual machine......\t\t"
- virsh define /tmp/myvm.xml &> /dev/null
- echo -e "\e[32;1m[OK]\e[0m"
24、點名器腳本
- #!/bin/bash
- # 編寫一個點名器腳本
-
- # 該腳本,需要提前準備一個 user.txt 文件
- # 該文件中需要包含所有姓名的信息,一行一個姓名,腳本每次隨機顯示一個姓名
- while :
- do
- #統計 user 文件中有多少用戶
- line=`cat user.txt |wc ‐l`
- num=$[RANDOM%line+1]
- sed -n "${num}p" user.txt
- sleep 0.2
- clear
- done
25、查看有多少遠程的 IP 在連接本機
- #!/bin/bash
- # 查看有多少遠程的 IP 在連接本機(不管是通過 ssh 還是 web 還是 ftp 都統計)
-
- # 使用 netstat ‐atn 可以查看本機所有連接的狀態,‐a 查看所有,
- # -t僅顯示 tcp 連接的信息,‐n 數字格式顯示
- # Local Address(第四列是本機的 IP 和端口信息)
- # Foreign Address(第五列是遠程主機的 IP 和端口信息)
- # 使用 awk 命令僅顯示第 5 列數據,再顯示第 1 列 IP 地址的信息
- # sort 可以按數字大小排序,最後使用 uniq 將多餘重複的刪除,並統計重複的次數
- netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c
26、對 100 以內的所有正整數相加求和(1+2+3+4...+100)
- #!/bin/bash
- # 對 100 以內的所有正整數相加求和(1+2+3+4...+100)
-
- #seq 100 可以快速自動生成 100 個整數
- sum=0
- for i in `seq 100`
- do
- sum=$[sum+i]
- done
- echo "總和是:$sum"
27、統計 13:30 到 14:30 所有訪問 apache 服務器的請求有多少個
- #!/bin/bash
- # 統計 13:30 到 14:30 所有訪問 apache 服務器的請求有多少個
-
- # awk 使用‐F 選項指定文件內容的分隔符是/或者:
- # 條件判斷$7:$8 大於等於 13:30,並且要求,$7:$8 小於等於 14:30
- # 最後使用 wc ‐l 統計這樣的數據有多少行,即多少個
- awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l
28、統計 13:30 到 14:30 所有訪問本機 Aapche 服務器的遠程 IP 地址是什麼
- #!/bin/bash
- # 統計 13:30 到 14:30 所有訪問本機 Aapche 服務器的遠程 IP 地址是什麼
- # awk 使用‐F 選項指定文件內容的分隔符是/或者:
- # 條件判斷$7:$8 大於等於 13:30,並且要求,$7:$8 小於等於 14:30
- # 日誌文檔內容裏面,第 1 列是遠程主機的 IP 地址,使用 awk 單獨顯示第 1 列即可
- awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log
29、打印國際象棋棋盤
- #!/bin/bash
- # 打印國際象棋棋盤
- # 設置兩個變量,i 和 j,一個代表行,一個代表列,國際象棋爲 8*8 棋盤
- # i=1 是代表準備打印第一行棋盤,第 1 行棋盤有灰色和藍色間隔輸出,總共爲 8 列
- # i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
- # 棋盤的規律是 i+j 如果是偶數,就打印藍色色塊,如果是奇數就打印灰色色塊
- # 使用 echo ‐ne 打印色塊,並且打印完成色塊後不自動換行,在同一行繼續輸出其他色塊
- for i in {1..8}
- do
- for j in {1..8}
- do
- sum=$[i+j]
- if [ $[sum%2] -eq 0 ];then
- echo -ne "\033[46m \033[0m"
- else
- echo -ne "\033[47m \033[0m"
- fi
- done
- echo
- done
30、統計每個遠程 IP 訪問了本機 apache 幾次?
- #!/bin/bash
- # 統計每個遠程 IP 訪問了本機 apache 幾次?
- awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log
31、統計當前 Linux 系統中可以登錄計算機的賬戶有多少個
- #!/bin/bash
- # 統計當前 Linux 系統中可以登錄計算機的賬戶有多少個
- #方法 1:
- grep "bash$" /etc/passwd | wc -l
- #方法 2:
- awk -f: '/bash$/{x++}end{print x}' /etc/passwd
32、統計/var/log 有多少個文件,並顯示這些文件名
- #!/bin/bash
- # 統計/var/log 有多少個文件,並顯示這些文件名
- # 使用 ls 遞歸顯示所有,再判斷是否爲文件,如果是文件則計數器加 1
- cd /var/log
- sum=0
- for i in `ls -r *`
- do
- if [ -f $i ];then
- let sum++
- echo "文件名:$i"
- fi
- done
- echo "總文件數量爲:$sum"
33、自動爲其他腳本添加解釋器信息
- #!/bin/bash
- # 自動爲其他腳本添加解釋器信息#!/bin/bash,如腳本名爲 test.sh 則效果如下:
- # ./test.sh abc.sh 自動爲 abc.sh 添加解釋器信息
- # ./test.sh user.sh 自動爲 user.sh 添加解釋器信息
-
- # 先使用 grep 判斷對象腳本是否已經有解釋器信息,如果沒有則使用 sed 添加解釋器以及描述信息
- if ! grep -q "^#!" $1; then
- sed '1i #!/bin/bash' $1
- sed '2i #Description: '
- fi
- # 因爲每個腳本的功能不同,作用不同,所以在給對象腳本添加完解釋器信息,以及 Description 後還希望
- # 繼續編輯具體的腳本功能的描述信息,這裏直接使用 vim 把對象腳本打開,並且光標跳轉到該文件的第 2 行
- vim +2 $1
34、自動化部署 varnish 源碼包軟件
- #!/bin/bash
- # 自動化部署 varnish 源碼包軟件
- # 本腳本需要提前下載 varnish‐3.0.6.tar.gz 這樣一個源碼包軟件,該腳本即可用自動源碼安裝部署軟件
-
- yum -y install gcc readline‐devel pcre‐devel
- useradd -s /sbin/nologin varnish
- tar -xf varnish‐3.0.6.tar.gz
- cd varnish‐3.0.6
-
- # 使用 configure,make,make install 源碼安裝軟件包
- ./configure ‐‐prefix=/usr/local/varnish
- make && make install
-
- # 在源碼包目錄下,將相應的配置文件拷貝到 Linux 系統文件系統中
- # 默認安裝完成後,不會自動拷貝或安裝配置文件到 Linux 系統,所以需要手動 cp 複製配置文件
- # 並使用 uuidgen 生成一個隨機密鑰的配置文件
-
- cp redhat/varnish.initrc /etc/init.d/varnish
- cp redhat/varnish.sysconfig /etc/sysconfig/varnish
- cp redhat/varnish_reload_vcl /usr/bin/
- ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
- ln -s /usr/local/varnish/bin/* /usr/bin
- mkdir /etc/varnish
- cp /usr/local/varnish/etc/varnish/default.vcl /etc/varnish/
- uuidgen > /etc/varnish/secret
35、編寫 nginx 啓動腳本
- #!/bin/bash
- # 編寫 nginx 啓動腳本
- # 本腳本編寫完成後,放置在/etc/init.d/目錄下,就可以被 Linux 系統自動識別到該腳本
- # 如果本腳本名爲/etc/init.d/nginx,則 service nginx start 就可以啓動該服務
- # service nginx stop 就可以關閉服務
- # service nginx restart 可以重啓服務
- # service nginx status 可以查看服務狀態
-
- program=/usr/local/nginx/sbin/nginx
- pid=/usr/local/nginx/logs/nginx.pid
- start(){
- if [ -f $pid ];then
- echo "nginx 服務已經處於開啓狀態"
- else
- $program
- fi
- stop(){
- if [ -! -f $pid ];then
- echo "nginx 服務已經關閉"
- else
- $program -s stop
- echo "關閉服務 ok"
- fi
- }
- status(){
- if [ -f $pid ];then
- echo "服務正在運行..."
- else
- echo "服務已經關閉"
- fi
- }
-
- case $1 in
- start)
- start;;
- stop)
- stop;;
- restart)
- stop
- sleep 1
- start;;
- status)
- status;;
- *)
- echo "你輸入的語法格式錯誤"
- esac
36、自動對磁盤分區、格式化、掛載
- #!/bin/bash
-
- # 自動對磁盤分區、格式化、掛載
- # 對虛擬機的 vdb 磁盤進行分區格式化,使用<<將需要的分區指令導入給程序 fdisk
- # n(新建分區),p(創建主分區),1(分區編號爲 1),兩個空白行(兩個回車,相當於將整個磁盤分一個區)
- # 注意:1 後面的兩個回車(空白行)是必須的!
- fdisk /dev/vdb << EOF
- n
- p
- 1
-
-
- wq
- EOF
-
- #格式化剛剛創建好的分區
- mkfs.xfs /dev/vdb1
-
- #創建掛載點目錄
- if [ -e /data ]; then
- exit
- fi
- mkdir /data
-
- #自動掛載剛剛創建的分區,並設置開機自動掛載該分區
- echo '/dev/vdb1 /data xfs defaults 1 2' >> /etc/fstab
- mount -a
37、自動優化 Linux 內核參數
- #!/bin/bash
- # 自動優化 Linux 內核參數
-
- #腳本針對 RHEL7
- cat >> /usr/lib/sysctl.d/00‐system.conf <<EOF
- fs.file‐max=65535
- net.ipv4.tcp_timestamps = 0
- net.ipv4.tcp_synack_retries = 5
- net.ipv4.tcp_syn_retries = 5
- net.ipv4.tcp_tw_recycle = 1
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_fin_timeout = 30
- #net.ipv4.tcp_keepalive_time = 120
- net.ipv4.ip_local_port_range = 1024 65535
- kernel.shmall = 2097152
- kernel.shmmax = 2147483648
- kernel.shmmni = 4096
- kernel.sem = 5010 641280 5010 128
- net.core.wmem_default=262144
- net.core.wmem_max=262144
- net.core.rmem_default=4194304
- net.core.rmem_max=4194304
- net.ipv4.tcp_fin_timeout = 10
- net.ipv4.tcp_keepalive_time = 30
- net.ipv4.tcp_window_scaling = 0
- net.ipv4.tcp_sack = 0
- EOF
-
- sysctl –p
38、切割 Nginx 日誌文件(防止單個文件過大,後期處理很困難)
- #mkdir /data/scripts
- #vim /data/scripts/nginx_log.sh
- #!/bin/bash
- # 切割 Nginx 日誌文件(防止單個文件過大,後期處理很困難)
- logs_path="/usr/local/nginx/logs/"
- mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
- kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
-
- # chmod +x /data/scripts/nginx_log.sh
- # crontab ‐e #腳本寫完後,將腳本放入計劃任務每天執行一次腳本
- 0 1 * * * /data/scripts/nginx_log.sh
39、檢測 MySQL 數據庫連接數量
- #!/bin/bash
- # 檢測 MySQL 數據庫連接數量
-
- # 本腳本每 2 秒檢測一次 MySQL 併發連接數,可以將本腳本設置爲開機啓動腳本,或在特定時間段執行
- # 以滿足對 MySQL 數據庫的監控需求,查看 MySQL 連接是否正常
- # 本案例中的用戶名和密碼需要根據實際情況修改後方可使用
- log_file=/var/log/mysql_count.log
- user=root
- passwd=123456
- while :
- do
- sleep 2
- count=`mysqladmin -u "$user" -p "$passwd" status | awk '{print $4}'`
- echo "`date +%Y‐%m‐%d` 併發連接數爲:$count" >> $log_file
- done
40、根據 md5 校驗碼,檢測文件是否被修改
- #!/bin/bash
- # 根據 md5 校驗碼,檢測文件是否被修改
- # 本示例腳本檢測的是/etc 目錄下所有的 conf 結尾的文件,根據實際情況,您可以修改爲其他目錄或文件
- # 本腳本在目標數據沒有被修改時執行一次,當懷疑數據被人篡改,再執行一次
- # 將兩次執行的結果做對比,MD5 碼發生改變的文件,就是被人篡改的文件
- for i in $(ls /etc/*.conf)
- do
- md5sum "$i" >> /var/log/conf_file.log
- done
41、檢測 MySQL 服務是否存活
- #!/bin/bash
- # 檢測 MySQL 服務是否存活
-
- # host 爲你需要檢測的 MySQL 主機的 IP 地址,user 爲 MySQL 賬戶名,passwd 爲密碼
- # 這些信息需要根據實際情況修改後方可使用
- host=192.168.51.198
- user=root
- passwd=123456
- mysqladmin -h '$host' -u '$user' -p'$passwd' ping &>/dev/null
- if [ $? -eq 0 ]
- then
- echo "MySQL is UP"
- else
- echo "MySQL is down"
- fi
42、備份 MySQL 的 shell 腳本(mysqldump版本)
- #!/bin/bash
- # 備份 MySQL 的 shell 腳本(mysqldump版本)
-
- # 定義變量 user(數據庫用戶名),passwd(數據庫密碼),date(備份的時間標籤)
- # dbname(需要備份的數據庫名稱,根據實際需求需要修改該變量的值,默認備份 mysql 數據庫)
-
- user=root
- passwd=123456
- dbname=mysql
- date=$(date +%Y%m%d)
-
- # 測試備份目錄是否存在,不存在則自動創建該目錄
- [ ! -d /mysqlbackup ] && mkdir /mysqlbackup
- # 使用 mysqldump 命令備份數據庫
- mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql
43、將文件中所有的小寫字母轉換爲大寫字母
- #!/bin/bash
- # 將文件中所有的小寫字母轉換爲大寫字母
-
- # $1是位置參數,是你需要轉換大小寫字母的文件名稱
- # 執行腳本,給定一個文件名作爲參數,腳本就會將該文件中所有的小寫字母轉換爲大寫字母
- tr "[a‐z]" "[A‐Z]" < $1
44、非交互自動生成 SSH 密鑰文件
- #!/bin/bash
- # 非交互自動生成 SSH 密鑰文件
-
- # ‐t 指定 SSH 密鑰的算法爲 RSA 算法;‐N 設置密鑰的密碼爲空;‐f 指定生成的密鑰文件>存放在哪裏
- rm -rf ~/.ssh/{known_hosts,id_rsa*}
- ssh‐keygen -t RSA -N '' -f ~/.ssh/id_rsa
45、檢查特定的軟件包是否已經安裝
- #!/bin/bash
- # 檢查特定的軟件包是否已經安裝
- if [ $# -eq 0 ];then
- echo "你需要制定一個軟件包名稱作爲腳本參數"
- echo "用法:$0 軟件包名稱 ..."
- fi
- # $@提取所有的位置變量的值,相當於$*
- for package in "$@"
- do
- if rpm -q ${package} &>/dev/null ;then
- echo -e "${package}\033[32m 已經安裝\033[0m"
- else
- echo -e "${package}\033[34;1m 未安裝\033[0m"
- fi
- done
46、監控 HTTP 服務器的狀態(測試返回碼)
- #!/bin/bash
- # 監控 HTTP 服務器的狀態(測試返回碼)
-
- # 設置變量,url爲你需要檢測的目標網站的網址(IP 或域名),比如百度
- url=http://http://183.232.231.172/index.html
-
- # 定義函數 check_http:
- # 使用 curl 命令檢查 http 服務器的狀態
- # ‐m 設置curl不管訪問成功或失敗,最大消耗的時間爲 5 秒,5 秒連接服務爲相應則視爲無法連接
- # ‐s 設置靜默連接,不顯示連接時的連接速度、時間消耗等信息
- # ‐o 將 curl 下載的頁面內容導出到/dev/null(默認會在屏幕顯示頁面內容)
- # ‐w 設置curl命令需要顯示的內容%{http_code},指定curl返回服務器的狀態碼
- check_http()
- {
- status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} $url)
- }
-
- while :
- do
- check_http
- date=$(date +%Y%m%d‐%H:%M:%S)
-
- # 生成報警郵件的內容
- echo "當前時間爲:$date
- $url 服務器異常,狀態碼爲${status_code}.
- 請儘快排查異常." > /tmp/http$$.pid
-
- # 指定測試服務器狀態的函數,並根據返回碼決定是發送郵件報警還是將正常信息寫入日誌
- if [ $status_code -ne 200 ];then
- mail -s Warning root < /tmp/http$$.pid
- else
- echo "$url 連接正常" >> /var/log/http.log
- fi
- sleep 5
- done
-
47、自動添加防火牆規則,開啓某些服務或端口(適用於 RHEL7)
- #!/bin/bash
- # 自動添加防火牆規則,開啓某些服務或端口(適用於 RHEL7)
- #
- # 設置變量定義需要添加到防火牆規則的服務和端口號
- # 使用 firewall‐cmd ‐‐get‐services 可以查看 firewall 支持哪些服務
- service="nfs http ssh"
- port="80 22 8080"
-
- # 循環將每個服務添加到防火牆規則中
- for i in $service
- do
- echo "Adding $i service to firewall"
- firewall‐cmd --add-service=${i}
- done
-
- #循環將每個端口添加到防火牆規則中
- for i in $port
- do
- echo "Adding $i Port to firewall"
- firewall‐cmd --add-port=${i}/tcp
- done
- #將以上設置的臨時防火牆規則,轉換爲永久有效的規則(確保重啓後有效)
- firewall‐cmd --runtime-to-permanent
48、使用腳本自動創建邏輯卷
- #!/bin/bash
- # 使用腳本自動創建邏輯卷
-
- # 清屏,顯示警告信息,創建將磁盤轉換爲邏輯卷會刪除數據
- clear
- echo -e "\033[32m !!!!!!警告(Warning)!!!!!!\033[0m"
- echo
- echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
- echo "腳本會將整個磁盤轉換爲 PV,並刪除磁盤上所有數據!!!"
- echo "This Script will destroy all data on the Disk"
- echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
- echo
- read -p "請問是否繼續 y/n?:" sure
-
- # 測試用戶輸入的是否爲 y,如果不是則退出腳本
- [ $sure != y ] && exit
-
- # 提示用戶輸入相關參數(磁盤、卷組名稱等數據),並測試用戶是否輸入了這些值,如果沒有輸入,則腳本退出
- read -p "請輸入磁盤名稱,如/dev/vdb:" disk
- [ -z $disk ] && echo "沒有輸入磁盤名稱" && exit
- read -p "請輸入卷組名稱:" vg_name
- [ -z $vg_name ] && echo "沒有輸入卷組名稱" && exit
- read -p "請輸入邏輯卷名稱:" lv_name
- [ -z $lv_name ] && echo "沒有輸入邏輯卷名稱" && exit
- read -p "請輸入邏輯卷大小:" lv_size
- [ -z $lv_size ] && echo "沒有輸入邏輯卷大小" && exit
-
- # 使用命令創建邏輯卷
- pvcreate $disk
- vgcreate $vg_name $disk
- lvcreate -L ${lv_size}M -n ${lv_name} ${vg_name}
49、顯示 CPU 廠商信息
- #!/bin/bash
- # 顯示 CPU 廠商信息
- awk '/vendor_id/{print $3}' /proc/cpuinfo | uniq
50、刪除某個目錄下大小爲 0 的文件
- #!/bin/bash
- # 刪除某個目錄下大小爲 0 的文件
-
- #/var/www/html 爲測試目錄,腳本會清空該目錄下所有 0 字節的文件
- dir="/var/www/html"
- find $dir -type f -size 0 -exec rm -rf {} \;
51、查找 Linux 系統中的殭屍進程
- #!/bin/bash
- # 查找 Linux 系統中的殭屍進程
-
- # awk 判斷 ps 命令輸出的第 8 列爲 Z 是,顯示該進程的 PID 和進程命令
- ps aux | awk '{if($8 == "Z"){print $2,$11}}'
52、提示用戶輸入年份後判斷該年是否爲閏年
- #!/bin/bash
- # 提示用戶輸入年份後判斷該年是否爲閏年
-
- # 能被4整除並且並不能被100整除的年份是閏年
- # 能被400整除的年份也是閏年
- read -p "請輸入一個年份:" year
-
- if [ "$year" = "" ];then
- echo "沒有輸入年份"
- exit
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、監控內存和磁盤容量,小於給定值時報警