编程技术分享平台

网站首页 > 技术教程 正文

linux 系统自动化巡检脚本总结

xnh888 2025-04-24 09:56:07 技术教程 14 ℃ 0 评论

一、系统资源巡检脚本

1. 基础资源监控脚本system_check.sh

#!/bin/bash
# 功能:检查CPU、内存、磁盘、网络状态
# 输出:表格化显示关键指标,异常值标红

# 定义颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 恢复默认颜色

# 获取系统时间
current_time=$(date "+%Y-%m-%d %H:%M:%S")

# CPU负载检查(1分钟)
cpu_load=$(uptime | awk -F 'load average:' '{print $2}' | cut -d, -f1)
cpu_cores=$(nproc)
load_threshold=$(echo "$cpu_cores * 0.7" | bc -l | awk '{printf "%.2f", $0}')

# 内存使用率
mem_total=$(free -m | awk '/Mem/{print $2}')
mem_used=$(free -m | awk '/Mem/{print $3}')
mem_percent=$(awk "BEGIN {printf \"%.1f\", $mem_used/$mem_total*100}")

# 磁盘根分区使用率
disk_percent=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')

# 网络连通性测试(以Google DNS为例)
network_check=$(ping -c 2 8.8.8.8 >/dev/null 2>&1 && echo "OK" || echo "FAIL")

# 输出结果(表格化)
echo -e "\n===== 系统资源巡检报告 ($current_time) ====="
printf "%-20s %-15s %-10s %s\n" "指标" "当前值" "阈值" "状态"
printf "%-20s %-15s %-10s " "CPU负载(1min)" "$cpu_load" "$load_threshold"
if (( $(echo "$cpu_load > $load_threshold" | bc -l) )); then
    echo -e "${RED}警告${NC}"
else
    echo -e "${GREEN}正常${NC}"
fi

printf "%-20s %-15s %-10s " "内存使用率" "${mem_percent}%" "80%"
if (( $(echo "$mem_percent > 80" | bc -l) )); then
    echo -e "${RED}警告${NC}"
else
    echo -e "${GREEN}正常${NC}"
fi

printf "%-20s %-15s %-10s " "磁盘使用率(根)" "${disk_percent}%" "90%"
if [ $disk_percent -gt 90 ]; then
    echo -e "${RED}警告${NC}"
else
    echo -e "${GREEN}正常${NC}"
fi

printf "%-20s %-15s %-10s " "网络连通性" "$network_check" "-"
if [ "$network_check" == "OK" ]; then
    echo -e "${GREEN}正常${NC}"
else
    echo -e "${RED}失败${NC}"
fi

使用说明:

chmod +x system_check.sh
./system_check.sh  # 直接运行

二、日志分析与告警脚本

2. 关键错误日志监控log_monitor.sh

#!/bin/bash
# 功能:扫描系统日志中的关键错误并触发告警
# 配置:自定义关键字和日志路径

LOG_FILE="/var/log/syslog"
KEYWORDS=("error" "fail" "timeout" "denied")
ALERT_EMAIL="admin@example.com"

# 临时存储匹配内容
TEMP_FILE="/tmp/critical_errors.log"

# 按时间范围过滤(最近1小时)
since_time=$(date -d "1 hour ago" "+%b %d %H")

# 搜索关键字并记录
echo "===== 关键错误日志 ($(date)) =====" > $TEMP_FILE
for keyword in "${KEYWORDS[@]}"; do
    grep -i -E "$keyword" $LOG_FILE | grep "$since_time" >> $TEMP_FILE
done

# 发送邮件告警(如果发现错误)
if [ -s $TEMP_FILE ]; then
    mail -s "[紧急] 系统发现关键错误日志" $ALERT_EMAIL < $TEMP_FILE
    echo "告警邮件已发送至 $ALERT_EMAIL"
else
    echo "未检测到关键错误日志"
fi

使用说明:

# 每30分钟运行一次
crontab -e
*/30 * * * * /path/to/log_monitor.sh

三、安全审计脚本

3. 用户权限审计脚本security_audit.sh

#!/bin/bash
# 功能:检查异常用户、SUID/SGID文件、SSH密钥
# 输出:生成安全审计报告

REPORT_FILE="/var/log/security_audit_$(date +%F).log"

# 检查空密码账户
echo "===== 空密码账户 =====" > $REPORT_FILE
awk -F: '($2 == "") {print $1}' /etc/shadow >> $REPORT_FILE

# 检查sudo权限用户
echo -e "\n===== 拥有sudo权限的用户 =====" >> $REPORT_FILE
grep -Po '^sudo.+:\K.*#39; /etc/group >> $REPORT_FILE

# 查找SUID/SGID文件
echo -e "\n===== 异常的SUID/SGID文件 =====" >> $REPORT_FILE
find / -type f $ -perm -4000 -o -perm -2000 $ -exec ls -l {} \; 2>/dev/null >> $REPORT_FILE

# 检查SSH公钥
echo -e "\n===== 用户SSH公钥 =====" >> $REPORT_FILE
for user in $(ls /home); do
    if [ -f "/home/$user/.ssh/authorized_keys" ]; then
        echo "用户 $user 的SSH密钥:" >> $REPORT_FILE
        cat "/home/$user/.ssh/authorized_keys" >> $REPORT_FILE
    fi
done

echo "安全审计报告已生成: $REPORT_FILE"

使用说明:

chmod +x security_audit.sh
sudo ./security_audit.sh  # 需要root权限

四、自动化备份脚本

4. MySQL数据库备份mysql_backup.sh

#!/bin/bash
# 功能:全量备份MySQL数据库并压缩存档
# 配置:修改数据库凭据和备份路径


DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 全量备份并压缩
mysqldump -u$DB_USER -p$DB_PASS --all-databases | gzip > $BACKUP_DIR/full_backup_$DATE.sql.gz

# 保留最近7天备份
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -delete

echo "MySQL备份完成: $BACKUP_DIR/full_backup_$DATE.sql.gz"

使用说明:

# 每天凌晨2点执行
0 2 * * * /path/to/mysql_backup.sh

五、高级功能扩展

5. 结合Prometheus的监控指标采集

#!/bin/bash
# 功能:采集自定义指标供Prometheus拉取
# 依赖:需安装Prometheus Node Exporter


OUTPUT_FILE="/var/lib/prometheus/node-exporter/custom_metrics.prom"

# 采集TCP连接数
tcp_connections=$(netstat -ant | wc -l)
echo "node_tcp_connections $tcp_connections" > $OUTPUT_FILE

# 采集僵尸进程数量
zombie_procs=$(ps aux | awk '{if ($8=="Z") print $0}' | wc -l)
echo "node_zombie_processes $zombie_procs" >> $OUTPUT_FILE

六、脚本管理建议

  1. 统一存放路径
/opt/scripts/           # 存放所有脚本
├── system_check.sh
├── log_monitor.sh
└── ...

2.日志统一管理

# 所有脚本日志重定向到/var/log/ops/
./system_check.sh >> /var/log/ops/system_check.log 2>&1

3.版本控制
使用Git管理脚本变更:

cd /opt/scripts
git init
git add .
git commit -m "初始化运维脚本"

总结

以上脚本覆盖了日常运维的核心场景,用户可根据实际需求调整阈值、告警方式和存储路径。建议结合Ansible批量分发脚本并配置统一调度(如Jenkins),构建完整的自动化运维体系。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表