从下面文件中挑选了几个常用的
MySQL 数据库备份单循环
每天自动保存数据库的全部数据,并且已数据库名进行命名;
最长保存时间为 15 天。
#!/bin/bash
DATE=$(date +%F_%H-%M-%S)
BACKUP_DIR="/data/db_backup/$(date +%F)"
HOST="localhost"
USER="backup"
PASS="123.com"
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")
# Create backup directory for the current date
mkdir -p $BACKUP_DIR
# Backup databases and save in the current date's directory
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
# Delete directories older than 15 days
find /data/db_backup/* -maxdepth 0 -type d -mtime +15 -exec rm -r {} \;
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]}}'
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
批量检测网站是否异常并邮件通知
#!/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 "网站$URL坏掉,请及时处理" | mail -s "$URL网站高危" 506230116@qq.com
fi
done
定时清空文件内容,定时记录文件大小
每小时执行一次脚本(任务计划),当时间为 0 点或 12 点时,将目标目录下的所有文件内#容清空,但不删除文件,其他时间则只统计各个文件的大小
一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件
#!/bin/bash
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 -sh $i >>$logfile
done
fi
扫描主机端口状态
#!/bin/bash
HOST=$1
PORT="22 25 80 8080"
for PORT in $PORT; do
if echo &>/dev/null >/dev/tcp/$HOST/$PORT; then
echo "$PORT open"
else
echo "$PORT close"
fi
done
监控主机的磁盘空间
当使用空间超过 90%,就通过发 mail 来发警告
#!/bin/bash
#monitor available disk space
#提取本服务器的IP地址信息
IP=$(ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " ")
SPACE=$(df -hP | awk '{print int($5)}')
if [ $SPACE -ge 90 ]; then
echo "$IP 服务器 磁盘空间 使用率已经超过90%,请及时处理。" | mail -s "$IP 服务器硬盘告警" mail@163.com
fi
http 心跳检测
URL="http://192.168.22.191/index.html"
THHP_CODE=$(curl -o /dev/null -s -w "%{http_code}" "${URL}")
if [ $HTTP_CODE != 200 ]; then
echo -e "apache code:"$HTTP_CODE""
fi