常用shell 脚本

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值