1、每週 5 使用 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),兩個空白行(兩個回車,相當於將整個磁盤分一個區)
#注意: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
19、Shell 腳本對信號的處理,執行腳本後,按鍵盤 Ctrl+C 無法終止的腳本
#!/bin/bash
#Author:丁丁歷險(Jacob)
#使用 trap 命令可以攔截用戶通過鍵盤或 kill 命令發送過來的信號
#使用 kill -l 可以查看 Linux 系統中所有的信號列表,其中 2 代表 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