17 個(gè)實(shí)用 shell 腳本,建議收藏!
作者:民工哥
來源:SegmentFault ?思否社區(qū)?
1、服務(wù)器系統(tǒng)配置初始化
#/bin/bash
#?安裝系統(tǒng)性能分析工具及其他
yum?install?gcc?make?autoconf?vim?sysstat?net-tools?iostat?iftop?iotp?wget?lrzsz?lsof?unzip?openssh-clients?net-tool?vim?ntpdate?-y
#?設(shè)置時(shí)區(qū)并同步時(shí)間
ln?-s?/usr/share/zoneinfo/Asia/Shanghai?/etc/localtime
if?!?crontab?-l?|grep?ntpdate?&>/dev/null?;?then
????(echo?"*?1?*?*?*?ntpdate?time.windows.com?>/dev/null?2>&1";crontab?-l)?|crontab?
fi
?
#?禁用selinux
sed?-i?'/SELINUX/{s/permissive/disabled/}'?/etc/selinux/config
?
#?關(guān)閉防火墻
if?egrep?"7.[0-9]"?/etc/redhat-release?&>/dev/null;?then
????systemctl?stop?firewalld
????systemctl?disable?firewalld
elif?egrep?"6.[0-9]"?/etc/redhat-release?&>/dev/null;?then
????service?iptables?stop
????chkconfig?iptables?off
fi
?
#?歷史命令顯示操作時(shí)間
if?!?grep?HISTTIMEFORMAT?/etc/bashrc;?then
????echo?'export?HISTTIMEFORMAT="%Y-%m-%d?%H:%M:%S??`whoami`?"'?>>?/etc/bashrc
fi
?
#?SSH超時(shí)時(shí)間
if?!?grep?"TMOUT=600"?/etc/profile?&>/dev/null;?then
????echo?"export?TMOUT=600"?>>?/etc/profile
fi
?
#?禁止root遠(yuǎn)程登錄?切記給系統(tǒng)添加普通用戶,給su到root的權(quán)限
sed?-i?'s/#PermitRootLogin?yes/PermitRootLogin?no/'?/etc/ssh/sshd_config
?
#?禁止定時(shí)任務(wù)向發(fā)送郵件
sed?-i?'s/^MAILTO=root/MAILTO=""/'?/etc/crontab?
?
#?設(shè)置最大打開文件數(shù)
if?!?grep?"*?soft?nofile?65535"?/etc/security/limits.conf?&>/dev/null;?then
cat?>>?/etc/security/limits.conf?<????*?soft?nofile?65535
????*?hard?nofile?65535
EOF
fi
?
#?系統(tǒng)內(nèi)核優(yōu)化
cat?>>?/etc/sysctl.conf?<net.ipv4.tcp_syncookies?=?1
net.ipv4.tcp_max_tw_buckets?=?20480
net.ipv4.tcp_max_syn_backlog?=?20480
net.core.netdev_max_backlog?=?262144
net.ipv4.tcp_fin_timeout?=?20??
EOF
?
#?減少SWAP使用
echo?"0"?>?/proc/sys/vm/swappiness
2、批量創(chuàng)建多個(gè)用戶并設(shè)置密碼
#!/bin/bash
USER_LIST=$@
USER_FILE=./user.info
for?USER?in?$USER_LIST;do
????if?!?id?$USER?&>/dev/null;?then
????????PASS=$(echo?$RANDOM?|md5sum?|cut?-c?1-8)
????????useradd?$USER
????????echo?$PASS?|?passwd?--stdin?$USER?&>/dev/null
????????echo?"$USER???$PASS"?>>?$USER_FILE
????????echo?"$USER?User?create?successful."
????else
????????echo?"$USER?User?already?exists!"
????fi
done
3、一鍵查看服務(wù)器利用率
#!/bin/bash
function?cpu(){
????
????util=$(vmstat?|?awk?'{if(NR==3)print?$13+$14}')
????iowait=$(vmstat?|?awk?'{if(NR==3)print?$16}')
????echo?"CPU -使用率:${util}% ,等待磁盤IO相應(yīng)使用率:${iowait}:${iowait}%"
?
}
function?memory?(){
?
????total=`free?-m?|awk?'{if(NR==2)printf?"%.1f",$2/1024}'`
????used=`free?-m?|awk?'{if(NR==2)?printf?"%.1f",($2-$NF)/1024}'`
????available=`free?-m?|awk?'{if(NR==2)?printf?"%.1f",$NF/1024}'`
????echo?"內(nèi)存?-?總大小:?${total}G?,?使用:?${used}G?,?剩余:?${available}G"
}
disk(){
????
????fs=$(df?-h?|awk?'/^\/dev/{print?$1}')
????for?p?in?$fs;?do
????????mounted=$(df?-h?|awk?'$1=="'$p'"{print?$NF}')
????????size=$(df?-h?|awk?'$1=="'$p'"{print?$2}')
????????used=$(df?-h?|awk?'$1=="'$p'"{print?$3}')
????????used_percent=$(df?-h?|awk?'$1=="'$p'"{print?$5}')
????????echo?"硬盤?-?掛載點(diǎn):?$mounted?,?總大小:?$size?,?使用:?$used?,?使用率:?$used_percent"
????done
?
}
function?tcp_status()?{
????summary=$(ss?-antp?|awk?'{status[$1]++}END{for(i?in?status)?printf?i":"status[i]"?"}')
????echo?"TCP連接狀態(tài)?-?$summary"
}
cpu
memory
disk
tcp_status
4、找出占用CPU?內(nèi)存過高的進(jìn)程
#!/bin/bash
echo?"-------------------CUP占用前10排序--------------------------------"
ps?-eo?user,pid,pcpu,pmem,args?--sort=-pcpu??|head?-n?10
echo?"-------------------內(nèi)存占用前10排序--------------------------------"
ps?-eo?user,pid,pcpu,pmem,args?--sort=-pmem??|head?-n?10
5、查看網(wǎng)卡的實(shí)時(shí)流量
#!/bin/bash
eth0=$1
echo??-e????"流量進(jìn)入--流量傳出????"
while?true;?do
????old_in=$(cat?/proc/net/dev?|grep?$eth0?|awk?'{print?$2}')
????old_out=$(cat?/proc/net/dev?|grep?$eth0?|awk?'{print?$10}')
????sleep?1
????new_in=$(cat?/proc/net/dev?|grep?$eth0?|awk?'{print?$2}')
????new_out=$(cat?/proc/net/dev?|grep?$eth0?|awk?'{print?$10}')
????in=$(printf?"%.1f%s"?"$((($new_in-$old_in)/1024))"?"KB/s")
????out=$(printf?"%.1f%s"?"$((($new_out-$old_out)/1024))"?"KB/s")
????echo?"$in?$out"
done
6、監(jiān)控多臺(tái)服務(wù)器磁盤利用率腳本
#!/bin/bash
HOST_INFO=host.info
for?IP?in?$(awk?'/^[^#]/{print?$1}'?$HOST_INFO);?do
????#取出用戶名和端口
????USER=$(awk?-v?ip=$IP?'ip==$1{print?$2}'?$HOST_INFO)
????PORT=$(awk?-v?ip=$IP?'ip==$1{print?$3}'?$HOST_INFO)
????#創(chuàng)建臨時(shí)文件,保存信息
????TMP_FILE=/tmp/disk.tmp
????#通過公鑰登錄獲取主機(jī)磁盤信息
????ssh?-p?$PORT?$USER@$IP?'df?-h'?>?$TMP_FILE
????#分析磁盤占用空間
????USE_RATE_LIST=$(awk?'BEGIN{OFS="="}/^\/dev/{print?$NF,int($5)}'?$TMP_FILE)
????#循環(huán)磁盤列表,進(jìn)行判斷
????for?USE_RATE?in?$USE_RATE_LIST;?do
????????#取出等號(hào)(=)右邊的值?掛載點(diǎn)名稱
????????PART_NAME=${USE_RATE%=*}??
????????#取出等號(hào)(=)左邊的值??磁盤利用率
????????USE_RATE=${USE_RATE#*=}
????????#進(jìn)行判斷
????????if?[?$USE_RATE?-ge?80?];?then
????????????echo?"Warning:?$PART_NAME?Partition?usage?$USE_RATE%!"
?????????????echo?"服務(wù)器$IP的磁盤空間占用過高,請(qǐng)及時(shí)處理"?|?mail?-s?"空間不足警告"?你的[email protected]
????????else
????????????echo?"服務(wù)器$IP的$PART_NAME目錄空間良好"
????????fi
????done
done
7、批量檢測(cè)網(wǎng)站是否異常并郵件通知
#!/bin/bash??
URL_LIST="www.baidu.com?www.ctnrs.com?www.der-matech.net.cn?www.der-matech.com.cn?www.der-matech.cn?www.der-matech.top?www.der-matech.org"
for?URL?in?$URL_LIST;?do
????FAIL_COUNT=0
????for?((i=1;i<=3;i++));?do
????????HTTP_CODE=$(curl?-o?/dev/null?--connect-timeout?3?-s?-w?"%{http_code}"?$URL)
????????if?[?$HTTP_CODE?-eq?200?];?then
????????????echo?"$URL?OK"
????????????break
????????else
????????????echo?"$URL?retry?$FAIL_COUNT"
????????????let?FAIL_COUNT++
????????fi
????done
????if?[?$FAIL_COUNT?-eq?3?];?then
????????echo?"Warning:?$URL?Access?failure!"
????????echo?"網(wǎng)站$URL壞掉,請(qǐng)及時(shí)處理"?|?mail?-s?"$URL網(wǎng)站高危"[email protected]
????fi
done
8、批量主機(jī)遠(yuǎn)程執(zhí)行命令腳本
#!/bin/bash
COMMAND=$*
HOST_INFO=host.info
for?IP?in?$(awk?'/^[^#]/{print?$1}'?$HOST_INFO);?do
????USER=$(awk?-v?ip=$IP?'ip==$1{print?$2}'?$HOST_INFO)
????PORT=$(awk?-v?ip=$IP?'ip==$1{print?$3}'?$HOST_INFO)
????PASS=$(awk?-v?ip=$IP?'ip==$1{print?$4}'?$HOST_INFO)
????expect?-c?"
???????spawn?ssh?-p?$PORT?$USER@$IP
???????expect?{
??????????\"(yes/no)\"?{send?\"yes\r\";?exp_continue}
??????????\"password:\"?{send?\"$PASS\r\";?exp_continue}
??????????\"$USER@*\"?{send?\"$COMMAND\r?exit\r\";?exp_continue}
???????}
????"
????echo?"-------------------"
done
9、一鍵部署LNMP網(wǎng)站平臺(tái)腳本
#!/bin/bash
NGINX_V=1.15.6
PHP_V=5.6.36
TMP_DIR=/tmp
?
INSTALL_DIR=/usr/local
?
PWD_C=$PWD
?
echo
echo?-e?"\tMenu\n"
echo?-e?"1.?Install?Nginx"
echo?-e?"2.?Install?PHP"
echo?-e?"3.?Install?MySQL"
echo?-e?"4.?Deploy?LNMP"
echo?-e?"9.?Quit"
?
function?command_status_check()?{
????if?[?$??-ne?0?];?then
????????echo?$1
????????exit
????fi?
}
?
function?install_nginx()?{
????cd?$TMP_DIR
????yum?install?-y?gcc?gcc-c++?make?openssl-devel?pcre-devel?wget
????wget?http://nginx.org/download/nginx-${NGINX_V}.tar.gz
????tar?zxf?nginx-${NGINX_V}.tar.gz
????cd?nginx-${NGINX_V}
????./configure?--prefix=$INSTALL_DIR/nginx?\
????--with-http_ssl_module?\
????--with-http_stub_status_module?\
????--with-stream
????command_status_check?"Nginx -?平臺(tái)環(huán)境檢查失敗!"
????make?-j?4?
????command_status_check?"Nginx -?編譯失敗!"
????make?install
????command_status_check?"Nginx -?安裝失敗!"
????mkdir?-p?$INSTALL_DIR/nginx/conf/vhost
????alias?cp=cp?;?cp?-rf?$PWD_C/nginx.conf?$INSTALL_DIR/nginx/conf
????rm?-rf?$INSTALL_DIR/nginx/html/*
????echo?"ok"?>?$INSTALL_DIR/nginx/html/status.html
????echo?''?>?$INSTALL_DIR/nginx/html/status.php
????$INSTALL_DIR/nginx/sbin/nginx
????command_status_check?"Nginx -?啟動(dòng)失敗!"
}
?
function?install_php()?{
????cd?$TMP_DIR
????yum?install?-y?gcc?gcc-c++?make?gd-devel?libxml2-devel?\
????????libcurl-devel?libjpeg-devel?libpng-devel?openssl-devel?\
????????libmcrypt-devel?libxslt-devel?libtidy-devel
????wget?http://docs.php.net/distributions/php-${PHP_V}.tar.gz
????tar?zxf?php-${PHP_V}.tar.gz
????cd?php-${PHP_V}
????./configure?--prefix=$INSTALL_DIR/php?\
????--with-config-file-path=$INSTALL_DIR/php/etc?\
????--enable-fpm?--enable-opcache?\
????--with-mysql?--with-mysqli?--with-pdo-mysql?\
????--with-openssl?--with-zlib?--with-curl?--with-gd?\
????--with-jpeg-dir?--with-png-dir?--with-freetype-dir?\
????--enable-mbstring?--enable-hash
????command_status_check?"PHP -?平臺(tái)環(huán)境檢查失敗!"
????make?-j?4?
????command_status_check?"PHP -?編譯失敗!"
????make?install
????command_status_check?"PHP -?安裝失敗!"
????cp?php.ini-production?$INSTALL_DIR/php/etc/php.ini
????cp?sapi/fpm/php-fpm.conf?$INSTALL_DIR/php/etc/php-fpm.conf
????cp?sapi/fpm/init.d.php-fpm?/etc/init.d/php-fpm
????chmod?+x?/etc/init.d/php-fpm
????/etc/init.d/php-fpm?start
????command_status_check?"PHP -?啟動(dòng)失敗!"
}
?
read?-p?"請(qǐng)輸入編號(hào):"?number
case?$number?in
????1)
????????install_nginx;;
????2)
????????install_php;;
????3)
????????install_mysql;;
????4)
????????install_nginx
????????install_php
????????;;
????9)
????????exit;;
esac
10、監(jiān)控MySQL主從同步狀態(tài)是否異常腳本
#!/bin/bash??
HOST=localhost
USER=root
PASSWD=123.com
IO_SQL_STATUS=$(mysql?-h$HOST?-u$USER?-p$PASSWD?-e?'show?slave?status\G'?2>/dev/null?|awk?'/Slave_.*_Running:/{print?$1$2}')
for?i?in?$IO_SQL_STATUS;?do
????THREAD_STATUS_NAME=${i%:*}
????THREAD_STATUS=${i#*:}
????if?[?"$THREAD_STATUS"?!=?"Yes"?];?then
????????echo?"Error:?MySQL?Master-Slave?$THREAD_STATUS_NAME?status?is?$THREAD_STATUS!"?|mail?-s?"Master-Slave?Staus"[email protected]
????fi
done
11、MySql數(shù)據(jù)庫備份腳本
分庫備份
mysqldump?-uroot?-pxxx?-B?A?>?A.sql
#!/bin/bash
DATE=$(date?+%F_%H-%M-%S)
HOST=localhost
USER=backup
PASS=123.com
BACKUP_DIR=/data/db_backup
DB_LIST=$(mysql?-h$HOST?-u$USER?-p$PASS?-s?-e?"show?databases;"?2>/dev/null?|egrep?-v?"Database|information_schema|mysql|performance_schema|sys")
?
for?DB?in?$DB_LIST;?do
????BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql
????if?!?mysqldump?-h$HOST?-u$USER?-p$PASS?-B?$DB?>?$BACKUP_NAME?2>/dev/null;?then
????????echo?"$BACKUP_NAME?備份失敗!"
????fi
done
分表備份
mysqldump?-uroot?-pxxx?-A?t?>?t.sql
#!/bin/bash
DATE=$(date?+%F_%H-%M-%S)
HOST=localhost
USER=backup
PASS=123.com
BACKUP_DIR=/data/db_backup
DB_LIST=$(mysql?-h$HOST?-u$USER?-p$PASS?-s?-e?"show?databases;"?2>/dev/null?|egrep?-v?"Database|information_schema|mysql|performance_schema|sys")
?
for?DB?in?$DB_LIST;?do
????BACKUP_DB_DIR=$BACKUP_DIR/${DB}_${DATE}
????[?!?-d?$BACKUP_DB_DIR?]?&&?mkdir?-p?$BACKUP_DB_DIR?&>/dev/null
????TABLE_LIST=$(mysql?-h$HOST?-u$USER?-p$PASS?-s?-e?"use?$DB;show?tables;"?2>/dev/null)
????for?TABLE?in?$TABLE_LIST;?do
????????BACKUP_NAME=$BACKUP_DB_DIR/${TABLE}.sql?
????????if?!?mysqldump?-h$HOST?-u$USER?-p$PASS?$DB?$TABLE?>?$BACKUP_NAME?2>/dev/null;?then
????????????echo?"$BACKUP_NAME?備份失敗!"
????????fi
????done
done
12、Nginx訪問日志分析
#!/bin/bash
#?日志格式:?$remote_addr?-?$remote_user?[$time_local]?"$request"?$status?$body_bytes_sent?"$http_referer"?"$http_user_agent"?"$http_x_forwarded_for"
LOG_FILE=$1
echo?"統(tǒng)計(jì)訪問最多的10個(gè)IP"
awk?'{a[$1]++}END{print?"UV:",length(a);for(v?in?a)print?v,a[v]}'?$LOG_FILE?|sort?-k2?-nr?|head?-10
echo?"----------------------"
?
echo?"統(tǒng)計(jì)時(shí)間段訪問最多的IP"
awk?'$4>="[01/Dec/2018:13:20:25"?&&?$4<="[27/Nov/2018:16:20:49"{a[$1]++}END{for(v?in?a)print?v,a[v]}'?$LOG_FILE?|sort?-k2?-nr|head?-10
echo?"----------------------"
?
echo?"統(tǒng)計(jì)訪問最多的10個(gè)頁面"
awk?'{a[$7]++}END{print?"PV:",length(a);for(v?in?a){if(a[v]>10)print?v,a[v]}}'?$LOG_FILE?|sort?-k2?-nr
echo?"----------------------"
?
echo?"統(tǒng)計(jì)訪問頁面狀態(tài)碼數(shù)量"
awk?'{a[$7"?"$9]++}END{for(v?in?a){if(a[v]>5)print?v,a[v]}}'?$LOG_FILE?|sort?-k3?-nr
13、Nginx訪問日志自動(dòng)按天(周、月)切割
#!/bin/bash
#nginx日志目錄
LOG_DIR=/www/server/nginx/logs
#獲取到上一天的時(shí)間
YESTERDAY_TIME=$(date?-d?"yesterday"?+%F)
#歸檔日志取時(shí)間
LOG_MONTH_DIR=$LOG_DIR/$(date?+"%Y-%m")
#歸檔日志的名稱
LOG_FILE_LIST="access.log"
?
for?LOG_FILE?in?$LOG_FILE_LIST;?do
????[?!?-d?$LOG_MONTH_DIR?]?&&?mkdir?-p?$LOG_MONTH_DIR
????mv?$LOG_DIR/$LOG_FILE?$LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_TIME}
done
?
kill?-USR1?$(cat?$LOG_DIR/nginx.pid)
14、自動(dòng)發(fā)布Java項(xiàng)目(Tomcat)
#!/bin/bash
DATE=$(date?+%F_%T)
?
TOMCAT_NAME=$1
TOMCAT_DIR=/usr/local/$TOMCAT_NAME
ROOT=$TOMCAT_DIR/webapps/ROOT
?
BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=tomcat-java-demo
?
#?拉取代碼
cd?$WORK_DIR
if?[?!?-d?$PROJECT_NAME?];?then
???git?clone?https://github.com/lizhenliang/tomcat-java-demo
???cd?$PROJECT_NAME
else
???cd?$PROJECT_NAME
???git?pull
fi
?
#?構(gòu)建
mvn?clean?package?-Dmaven.test.skip=true
if?[?$??-ne?0?];?then
???echo?"maven?build?failure!"
???exit?1
fi
?
#?部署
TOMCAT_PID=$(ps?-ef?|grep?"$TOMCAT_NAME"?|egrep?-v?"grep|$$"?|awk?'NR==1{print?$2}')
[?-n?"$TOMCAT_PID"?]?&&?kill?-9?$TOMCAT_PID
[?-d?$ROOT?]?&&?mv?$ROOT?$BACKUP_DIR/${TOMCAT_NAME}_ROOT$DATE
unzip?$WORK_DIR/$PROJECT_NAME/target/*.war?-d?$ROOT
$TOMCAT_DIR/bin/startup.sh
15、自動(dòng)發(fā)布PHP項(xiàng)目
#!/bin/bash
?
DATE=$(date?+%F_%T)
?
WWWROOT=/usr/local/nginx/html/$1
?
?
BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=php-demo
?
?
#?拉取代碼
cd?$WORK_DIR
if?[?!?-d?$PROJECT_NAME?];?then
???git?clone?https://github.com/lizhenliang/php-demo
???cd?$PROJECT_NAME
else
???cd?$PROJECT_NAME
???git?pull
fi
?
?
#?部署
if?[?!?-d?$WWWROOT?];?then
???mkdir?-p?$WWWROOT
???rsync?-avz?--exclude=.git?$WORK_DIR/$PROJECT_NAME/*?$WWWROOT
else
???rsync?-avz?--exclude=.git?$WORK_DIR/$PROJECT_NAME/*?$WWWROOT
fi
16、DOS攻擊防范(自動(dòng)屏蔽攻擊IP)
#!/bin/bash
DATE=$(date?+%d/%b/%Y:%H:%M)
#nginx日志
LOG_FILE=/usr/local/nginx/logs/demo2.access.log
#分析ip的訪問情況
ABNORMAL_IP=$(tail?-n5000?$LOG_FILE?|grep?$DATE?|awk?'{a[$1]++}END{for(i?in?a)if(a[i]>10)print?i}')
for?IP?in?$ABNORMAL_IP;?do
????if?[?$(iptables?-vnL?|grep?-c?"$IP")?-eq?0?];?then
????????iptables?-I?INPUT?-s?$IP?-j?DROP
????????echo?"$(date?+'%F_%T')?$IP"?>>?/tmp/drop_ip.log
????fi
done
17、目錄入侵檢測(cè)與告警
#!/bin/bash
?
MON_DIR=/opt
inotifywait?-mqr?--format?%f?-e?create?$MON_DIR?|\
while?read?files;?do
???#同步文件
???rsync?-avz?/opt?/tmp/opt
??#檢測(cè)文件是否被修改
???#echo?"$(date?+'%F?%T')?create?$files"?|?mail?-s?"dir?monitor"[email protected]
done
評(píng)論
圖片
表情
