1、实时监控本机内存和硬盘剩余空间,剩余内存小于500M,根分区剩余空间小于1000M的时候发送警邮件
#!/bin/bash
# Author: Peter zh
# Blog: https://home.cnblogs.com/zhangwduoduoj/
# Time: 2019-08-17 20:29:30
# Name: jiankong.sh
# Version: v1.0
# Description: This is a Script.
free=`free -m|awk 'NR==3 {print$4 }'`
df=`df |awk 'NR==2{print $4}'`
if [[ $free -lt 500 && $df -lt 1000000 ]];then
mail -s "Warning~" 1227566276@qq.com
echo 'send success!'
else
echo 'zhengchang!'
exit 0
fi
2、DOS攻击防范(自动屏蔽攻击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
3、每天自动备份 MySQL 数据库
#!/bin/sh
# Database info
DB_USER="batsing"
DB_PASS="batsingpw"
DB_HOST="localhost"
DB_NAME="timepusher"
# 一些变量
BIN_DIR="/usr/bin" #mysql bin路径
BCK_DIR="/mnt/mysqlBackup" #备份文件目录
DATE=`date +%F`
# TODO
# /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/db_$DATE.sql
#还原数据库
#用mysql-front导入前一天的 *.sql 文件即可恢复数据
4、定时清空文件,定时记录文件大小
#!/bin/bash
#################################################################
每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内#容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件
################################################################
logfile=/tmp/`date +%H-%F`.log
n=`date +%H`
if [ n -eq 00 ] || [n -eq 12 ]
then
#通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作
for i in `find /data/log/ -type f`
do
true > i
done
else
for i in `find /data/log/ -type f`
do
du -shi >> $logfile
done
fi
5、监控 httpd 的进程数,根据监控情况做相应处理
#!/bin/bash
###############################################################################################################################
#需求:
#1.每隔10s监控httpd的进程数,若进程数大于等于500,则自动重启Apache服务,并检测服务是否重启成功
#2.若未成功则需要再次启动,若重启5次依旧没有成功,则向管理员发送告警邮件,并退出检测
#3.如果启动成功,则等待1分钟后再次检测httpd进程数,若进程数正常,则恢复正常检测(10s一次),否则放弃重启并向管理员发送告警邮件,并退出检测
###############################################################################################################################
#计数器函数
check_service()
{
j=0
for i in `seq 1 5`
do
#重启Apache的命令
/usr/local/apache2/bin/apachectl restart 2> /var/log/httpderr.log
#判断服务是否重启成功
if [ ? -eq 0 ] then
break
else
j=[j+1] fi
#判断服务是否已尝试重启5次
if [j -eq 5 ] then
mail.py exit
fi
done }while :do
n=`pgrep -l httpd|wc -l`
#判断httpd服务进程数是否超过500
if [ n -gt 500 ] then
/usr/local/apache2/bin/apachectl restart if [? -ne 0 ]
then
check_service
else
sleep 60
n2=`pgrep -l httpd|wc -l`
#判断重启后是否依旧超过500
if [ $n2 -gt 500 ]
then
mail.py exit
fi
fi
fi
#每隔10s检测一次
sleep 10done
6、iptables 自动屏蔽访问网站频繁的Ip
场景:恶意访问,安全防范 屏蔽每分钟访问超过200的IP
方法1:根据访问日志(Nginx为例)
#!/bin/bash
DATE=(date +%d/%b/%Y:%H:%M)
ABNORMAL_IP=(tail -n5000 access.log |grep DATE |awk '{a[1]++}END{for(i in a)if(a[i]>100)print i}')
#先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。
for IP in ABNORMAL_IP; do
if [(iptables -vnL |grep -c "IP") -eq 0 ]; then
iptables -I INPUT -sIP -j DROP fidone
方法2:通过TCP建立的连接
#!/bin/bash
ABNORMAL_IP=(netstat -an |awk '4~/:80/ &&6~/ESTABLISHED/{gsub(/:[0-9]+/,"",5);{a[5]++}}END{for(i in a)if(a[i]>100)print i}')
#gsub是将第五列(客户端IP)的冒号和端口去掉
for IP in ABNORMAL_IP; do
if [(iptables -vnL |grep -c "IP") -eq 0 ]; then
iptables -I INPUT -sIP -j DROP
fi
done
7、屏蔽每分钟SSH尝试登录超过10次的IP
方法1:通过lastb获取登录状态:
#!/bin/bash
DATE=(date +"%a %b %e %H:%M") #星期月天时分 %e单数字时显示7,而%d显示07
ABNORMAL_IP=(lastb |grep "DATE" |awk '{a[3]++}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 -sIP -j DROP fidone
方法2:通过日志获取登录状态
#!/bin/bash
DATE=(date +"%b %d %H")
ABNORMAL_IP="(tail -n10000 /var/log/auth.log |grep "DATE" |awk '/Failed/{a[(NF-3)]++}END{for(i in a)if(a[i]>5)print i}')"
for IP in ABNORMAL_IP; do
if [(iptables -vnL |grep -c "IP") -eq 0 ]; then
iptables -A INPUT -sIP -j DROP
echo "(date +"%F %T") - iptables -A INPUT -sIP -j DROP" >>~/ssh-login-limit.log
fi
done
8、根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
#!/bin/bash
####################################################################################
#根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
####################################################################################
logfile=/data/log/access.log
#显示一分钟前的小时和分钟
d1=`date -d "-1 minute" +%H%M`
d2=`date +%M`
ipt=/sbin/iptables
ips=/tmp/ips.txt
block()
{
#将一分钟前的日志全部过滤出来并提取IP以及统计访问次数
grep 'd1:'logfile|awk '{print 1}'|sort -n|uniq -c|sort -n>ips
#利用for循环将次数超过100的IP依次遍历出来并予以封禁
for i in `awk '1>100 {print2}' ips` doipt -I INPUT -p tcp --dport 80 -s i -j REJECT echo "`date +%F-%T`i" >> /tmp/badip.log
done
}
unblock()
{
#将封禁后所产生的pkts数量小于10的IP依次遍历予以解封
for a in `ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '2<10 {print 1}'|sort -nr` doipt -D INPUT a
doneipt -Z
}
#当时间在00分以及30分时执行解封函数
if [ d2 -eq "00" ] || [d2 -eq "30" ]
then
#要先解再封,因为刚刚封禁时产生的pkts数量很少
unblock
block
else
block
fi
9、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 "统计访问最多的10个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 "统计时间段访问最多的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 "统计访问最多的10个页面"
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 "统计访问页面状态码数量"
awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}' $LOG_FILE |sort -k3 -nr