运维-简单的shell脚本

#写自定义的监控脚本---内存或者cpu占用超过80发邮件提醒

#!/bin/bash
#内存使用率
total=`free -m |awk '/Mem/ {print $2}'`
#已用内存
used=`free -m |awk '/Mem/ {print $3}'`
#空闲内存
free=`free -m |awk '/Mem/ {print $4}'`
#共享内存
shared=`free -m|awk '/Mem/ {print $5}'`

ratef=$(printf "%.4f" $(echo "scale=4; $used / $total" | bc))
rate=$(printf "%.2f" "$(echo "$ratef*100"|bc)")


#cpu
cpu=`top -n 1|grep "%Cpu(s)" |awk '{print $4}'`

send_mail(){
        recpient=xxxxxxxx@qq.com
        subject=$warning
        body=$event
        echo "$body" |mail -s "$subject" $recpient 
}


#判断内存情况
if (( $(echo "$rate > 80"|bc) ));then

        echo -e "内存占用达到$rate%\n启动告警!!!"
        warning=`echo "内存告警,请及时优化"`
        event=` echo "内存占用达到$rate%"`
        send_mail
else
        echo "内存占用达到$rate%"
fi

#判断cpu情况
if (( $(echo "$cpu > 5"|bc)  )); then
        echo -e "当前cpu已经到达阈值$cpu%\n"
        warning=`echo "cpu告警,请及时优化"`
        event=`echo "cpu 已经到达$cpu%"`
        send_mail
else
        echo "cpu占用达到$cpu%"
fi


#定期删除30天内无变动日志文件

#!/bin/bash
log_dir="/var/log"
log_txt=`find /var/log -type f -name "*.log" -mtime +30`
echo "近30天未改動的日誌:$log_txt"
find $log_dir -type f -name "*.log" -mtime +30 -exec rm {} \;
echo “$log_txt” | mail -s  "近30天未改動日誌已經被刪除" xxxxxxx@qq.com

#自动化创建linux用户

#!/bin/bash

read -p "请问宁要创建几个用户:" count
for ((i=1; i<=$count; i++))
do
        user_list=`cat /etc/passwd|awk -F : '$6 ~ /\/home/ {print $1}'`
        echo "已存在用户表:$user_list"

        while true; do
                read -p "请输入你要创建的用户名:" username
                if [ -z "$username" ];then
                        echo "用户名不能为空"
                elif echo "$user_list"|grep -q "^$username$";then
                        echo "该用户已经存在!"
                else 
                        echo "用户【$username】已经创建!"
                        break
                fi
        done

        while true; do
                read -p  "请输入第$i个用户的密码(至少8位且至少一个数字一个字母和一个特殊符号):" password
                if [[ $password =~ [0-9] && $password =~ [a-zA-Z] && $password =~ [_!@#$%,\.] && ${#password} -gt 8  ]];then                        echo "ok"
                        break
                else 
                        echo "格式不对!"
                fi
        done
done

#检测服务器中重要的文件是否被修改过,如果修改则报警(指纹:md5sum比对)

#!/bin/bash
# 定义重要文件的路径和对应的指纹
declare -A important_files=(
    ["/etc/passwd"]="345d70772d9cf0a5471e5e4f43d43a3d"
    ["/root/file.txt"]="cfc03641afbbaa0a63d5712ea56e1688"
)
# 检测文件是否被修改
for file in "${!important_files[@]}"; do
    # 计算当前文件的指纹
    current_finger=$(md5sum "$file" | awk '{print $1}')
    # 比较当前指纹和预设的指纹
    if [[ "$current_finger" != "${important_files[$file]}" ]]; then
        echo "文件$file 已经被修改,请尽快处理!"|mail -s "警报--finger" xxxxxxx@qq.com
    fi
done

#计算nginx日志中访问最多的ip使用的

#nginx中的access.log日志位置
access_log="/usr/local/nginx/logs/access.log"

#筛选ip
ip_list=`cat $access_log|awk '{print $1}'`

#排列
sort_list=`echo -e "$ip_list\n"|sort |uniq -c|sort -rk1n|awk 'NR>1 {print $0}'`
echo -e "访问量最大的10个ip\n$sort_list"

#防止ddos攻击,将单位时间内访问量过大的进行封禁

#!/bin/bash
access_log="/usr/local/nginx/logs/access.log"
ban_time=60
access_time=100
ip_list=$(awk '{ ip[$1]++ } END {for (i in ip) print i,ip[i] }' "$access_log")


while IFS= read -r line;
do
        ip=$(echo "$line" |awk '{print $1}')
        pv=$(echo "$line" |awk '{print $2}')
        if [ "$pv" -gt "$access_time" ];then
                echo "访问量过大"
                iptables -A INPUT -s "$ip" -j DROP
                echo "已经封禁$ip"
                sleep "$ban_time"
                iptables -D INPUT -s "$ip" -j DROP
                echo "已经解封$ip"                 
        fi
done <<< "$ip_list"

扩展:甚至可以将创建恶意ip名单-bad_ip
# echo "192.168.1.4" >> bad_ip --- 加入黑名单
# sed -i '/192.168.1.4/d' bad_ip --- 移除黑名单

#MYSQL备份和恢复脚本

#任务计划:

crontab -e---进入编辑
* * * * * /path/to/bash---分时日月周 命令或者执行sh
ctrl+o---保存 
回车
ctrl+x---退出

#msyql备份:

全量备份:
mysqldump -u【root】 -p【password】 -B mydb > mydb.sql

恢复:
mysql -u【root】 -p【password】 < mydb.sql
#cat mysql_back.sh                                                                                     

#!/bin/bash

#mysql数据库信息
username="root"
password="XXXXXXXXX"
db_name="mydb"

#默认备份文件目录
back_up_dir="/root/back_up_dir"
mkdir back_up_dir -p

#默认备份文件文件名
back_up_file="$back_up_dir/back_up_$(date +%y%m%d_%H%M)_${db_name}.sql"
echo "$back_up_file"
#使用mysqldump备份
mysqldump -u$username -p$password  $db_name >$back_up_file

#检查备份是否成功
if [ $? -eq 0 ];then
    echo "数据库备份成功:$back_up_file"
else 
    echo "数据库备份失败"
    echo "错误码:$?"
fi
# crontab -l|grep -v '^#'
0 13 * * * /bin/bash /root/mysql_back.sh 
# ll                              
总用量 8
-rw-r--r-- 1 root root 7952  3月 30 13:00 back_up_240330_1300_mydb.sql
posted @ 2024-04-08 12:08  木玄玑  阅读(8)  评论(0)    收藏  举报