05—Shell 腳本實戰(精華版)

1、每週 使用 tar 命令備份/var/log 下的所有日誌文件

 

#vi /root/logbak.sh

#編寫備份腳本,備份後的文件名包含日期標籤,防止後面的備份將前面的備份數據覆蓋

#注意 date 命令需要使用反引號括起來,反引號在鍵盤<tab>鍵上面

 

tar -czf log-`date +%Y%m%d`.tar.gz /var/log

 

# crontab -e #編寫計劃任務,執行備份腳本

00 03 * * 5 /root/logbak.sh

 

#0    12   *   *   *   

#分  時   日   月  周  |==============命令行=======================|

 

代表意義 分鐘 小時 日期 月份 命令

數字範圍 0~59 0~23 1~31 1~12 0~7  *

 

2、實時監控本機內存和硬盤剩餘空間,剩餘內存小於 500M、根分區剩餘空間小於 1000M 時,發送報警郵件給root 管理員

 

#!/bin/bash

#Author:XXX

#提取根分區剩餘空間

disk_size=$(df / |awk '/\//{print $4}')

#提取內存剩餘空間

mem_size=$(free |awk '/Mem/{print $4}')

while :

do

#注意內存和磁盤提取的空間大小都是以 Kb 爲單位,test語法中-a表示邏輯與

if [ $disk_size -le 512000 -a $mem_size -le 1024000 ];then

mail -s Warning root <<EOF

Insufficient resources,資源不足

EOF

fi

Done

 

3、腳本生成一個 100 以內的隨機數,提示用戶猜數字,根據用戶的輸入,提示用戶猜對了,猜小了或猜大了,直至用戶猜對腳本結束。

 

#!/bin/bash

#RANDOM 爲系統自帶的系統變量,值爲 0-32767 的隨機數

#使用取餘算法將隨機數變爲 1-100 的隨機數

num=$[RANDOM%100+1]

#使用 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

 

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

 

#!/bin/bash

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}

#上面這句不太理解,明明pass=123456即可,知道的夥伴請留言幫我解惑,謝謝!!     

useradd "$user"

echo "$pass" | passwd --stdin "$user"

 

#上述stty的功能可以通過read -s 功能實現

 

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

#!/bin/bash

for i in {1..254}

do

ping -c2 -i0.3 -W1 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

#關於ping命令的用法參考:https://blog.csdn.net/xianjie0318/article/details/65444028

 

6、編寫腳本,顯示進度條。

 

參照:https://www.cnblogs.com/tianyapiaozi/archive/2011/06/11/2513899.html比較詳細

 

7、使用死循環實時顯示 eth0 網卡發送的數據包流量(熟悉管道符和awk的用法)

 

#!/bin/bash

while :

do

echo '本地網卡 eth0 流量信息如下: '

ifconfig eth0 | grep "RX pack" | awk '{print $5}'

ifconfig eth0 | grep "TX pack" | awk '{print $5}'

sleep 1

done

 

8、使用 user.txt 文件中的人員名單,在計算機中自動創建對應的賬戶並配置初始密碼123456(批量創建用戶並配置初始密碼)

 

#!/bin/bash

#本腳本執行,需要提前準備一個 user.txt 文件,該文件中包含有若干用戶名信息,也可以通過腳本for循環創建一個有規律用戶名文件,實現批量創建。

for i in `cat user.txt`

do

useradd $i

echo "123456" | passwd --stdin $i

Done

 

9、編寫批量修改擴展名腳本,如批量將 txt 文件修改爲 doc 文件。

 

#!/bin/bash

#執行腳本時,需要給腳本添加位置參數

#腳本名 txt doc(可以將 txt 的擴展名修改爲 doc

#腳本名 doc jpg(可以將 doc 的擴展名修改爲 jpg

for i in "ls *.$1"

do

mv $i ${i%.*}.$2

done

 

10、一鍵部署 LNMP(源碼安裝版本) //包的版本根據實際情況而定

 

#!/bin/bash

#Author:丁丁歷險(Jacob)

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   //這裏根據實際情況添加需要的模塊如:--with-gd

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

 

#事實上,前人已經把這個東西做的相當成熟,請參考:https://lnmp.org/

 

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

 

#!/bin/bash

#Author:丁丁歷險(Jacob)

#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

 

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

 

#!/bin/bash

#Author:丁丁歷險(Jacob)

#對虛擬機的 vdb 磁盤進行分區格式化,使用<<將需要的分區指令導入給程序 fdisk

#n(新建分區),p(創建主分區),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

 

13、自動優化 Linux 內核參數

#參數含義,參考:https://www.cnblogs.com/luchuangao/p/8275760.html

#!/bin/bash

#Author:丁丁歷險(Jacob)

#腳本針對 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

 

14、切割 Nginx 日誌文件(常用)

#mkdir /data/scripts

#vim /data/scripts/nginx_log.sh

 

#!/bin/bash

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

 

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

 

#!/bin/bash

#定義變量 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

 

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

 

#!/bin/bash

#Author:丁丁歷險(Jacob)

#設置變量定義需要添加到防火牆規則的服務和端口號

#使用 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

 

17、設置 Python 支持自動命令補齊功能

 

#!/bin/bash

#Author:丁丁歷險(Jacob)

#Summary:Enable tab complete for python

#Description:

#  Needs import readline and rlcompleter module

#  import readline

#  import rlcompleter

#  help(rlcompleter) display detail: readline.parse_and_bind('tab: complete')

#  man python display detail: PYTHONSTARTUP variable

if [ ! -f /usr/bin/tab.py ];then

cat >> /usr/bin/tab.py <<EOF

import readline

import rlcompleter

readline.parse_and_bind('tab: complete')

EOF

fi

sed -i '$a export PYTHONSTARTUP=/usr/bin/tab.py' /etc/profile

source /etc/profile

 

18顯示本機 Linux 系統上所有開放的端口列表(實用)

 

#!/bin/bash

#Author:丁丁歷險(Jacob)

#從端口列表中觀測有沒有沒用的端口,有的話可以將該端口對應的服務關閉,防止意外的***可能性

ss -nutlp |awk '{print $1,$5}' |awk -F"[: ]" '{print "協議:"$1,"端口號:"$NF}' |grep "[0-9]" |uniq

 

 19Shell 腳本對信號的處理,執行腳本後,按鍵盤 Ctrl+C 無法終止的腳本

 

#!/bin/bash

#Author:丁丁歷險(Jacob)

#使用 trap 命令可以攔截用戶通過鍵盤或 kill 命令發送過來的信號

#使用 kill -l 可以查看 Linux 系統中所有的信號列表,其中 代表 Ctrl+C

#trap 當發現有用戶 ctrl+C 希望終端腳本時,就執行 echo "暫停 10s";sleep 10 這兩條命令

#另外用戶使用命令:[ kill -2 腳本的 PID ] 也可以中斷腳本和 Ctrl+C 一樣的效果,都會被 trap 攔截

 

trap 'echo "暫停 10s";sleep 10' 2

while :

do

echo "go go go"

done

 

20、關閉 SELinux

 

#!/bin/bash

sed -i '/^SELINUX/s/=.*/=disabled/' /etc/selinux/config

setenforce 0

 

更多腳本,請自行下載。

https://pan.baidu.com/s/1xLRSWpl8oxluVEGrIxDDEg


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