大纲 前言 本文将介绍 CentOS 7 系统如何使用 Shell 脚本,实现对磁盘使用率的监控,并发送告警邮件(支持腾讯企业邮箱或者 QQ 邮箱)。
准备工作 防火墙配置 1 sudo systemctl status firewalld
1 2 3 4 5 sudo systemctl enable firewalld sudo systemctl start firewalld
防火墙开放 22 端口(避免 SSH 远程连接断开 ) 1 sudo firewall-cmd --permanent --add-port=22/tcp
防火墙开放 465 端口(SMTPS,用于邮件发送) 1 sudo firewall-cmd --permanent --add-port=465/tcp
1 sudo firewall-cmd --reload
1 sudo firewall-cmd --list-ports
安装邮件服务 1 sudo yum install mailx -y
导入 NSS 证书 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo mkdir -p /root/.certs/ sudo sh -c "echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /root/.certs/qq-smtp.crt" sudo certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/qq-smtp.crt sudo certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/qq-smtp.crt sudo certutil -L -d /root/.certs
特别注意
(1) 在导入证书时,要特别注意当前使用的是哪个用户进行操作。 (2) 当使用 root 用户导入证书,那么在测试邮件发送、测试磁盘监控脚本、添加定时任务(比如 Crontab)的时候也必须使用 root 用户。 (3) 同理,当使用普通用户导入证书,那么在测试邮件发送、测试磁盘监控脚本、添加定时任务(比如 Crontab)的时候也必须使用普通用户。 1 2 3 4 5 6 7 8 9 10 1. 获取授权码: - 腾讯邮箱(包括腾讯企业邮箱和 QQ 邮箱)需要在邮箱设置中生成 SMTP 服务授权码。 - 登录邮箱,前往 设置 -> 帐号设置 -> SMTP 服务,生成授权码并使用它代替密码。 2. 安全性设置: - 确保已启用 SMTP 服务和客户端登录支持。 3. SMTP 服务器地址: - QQ 邮箱: smtp.qq.com - 腾讯企业邮箱:smtp.exmail.qq.com
编辑系统配置文件,在文件末尾追加以下内容(请自行更改以下配置信息,切忌直接复制,这里使用的是 QQ 邮箱 ) 1 2 3 4 5 6 7 8 9 10 11 12 13 sudo cp /etc/mail.rc /etc/mail.rc.bak sudo vi /etc/mail.rc set from=clay@qq.comset smtp="smtps://smtp.qq.com:465" set smtp-auth-user=clay@qq.comset smtp-auth-password=xxxxxxxxxxxxset smtp-auth=loginset ssl-verify=ignoreset nss-config-dir=/root/.certs
配置项 说明 set from设置发件人的邮箱地址,邮件的 “From” 字段会显示此地址。 set smtp指定使用腾讯邮箱的 SMTP 服务器地址和端口号(465 为 SMTPS 加密端口)。若使用的是腾讯企业邮箱,那么应该配置为 set smtp="smtps://smtp.exmail.qq.com:465"。 set smtp-auth-user指定用于 SMTP 身份验证的用户名,通常是发件人的完整邮箱地址。 set smtp-auth-password指定用于 SMTP 身份验证的密码或授权码(QQ 邮箱需使用专用授权码)。 set smtp-auth设置 SMTP 身份验证的模式为 login,常见的认证方式之一。 set ssl-verify忽略 SSL 证书验证(适用于证书问题或调试环境,但不建议在生产环境中忽略验证)。 set nss-config-dir指定 NSS(Network Security Services)库的证书配置目录,用于管理 SSL/TLS 证书和加密连接。
测试邮件发送 1 sudo sh -c "echo 'TestMail~' | mail -s 'TestMail' xxx@qq.com 2>/dev/null"
1 sudo tail -f /var/log /maillog
脚本实现 1 sudo vi /opt/disk_monitor.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #!/bin/bash THRESHOLD=90 EMAIL="xxx@qq.com" DISK_DEVICE=/dev/sda1 LOG_FILE=/tmp/disk_monitor.log if [ ! -f "$LOG_FILE " ]; then touch "$LOG_FILE " fi IP_ADDRESS=$(curl -s https://checkip.amazonaws.com) if [ -n "$IP_ADDRESS " ]; then IP_ADDRESS="0.0.0.0" fi CURRENT_USAGE=$(df -h $DISK_DEVICE | awk 'NR==2 {print $5}' | sed 's/%//g' ) echo "$(date '+%Y-%m-%d %H:%M:%S') 磁盘设备 $DISK_DEVICE 的使用率为 $CURRENT_USAGE %" >> $LOG_FILE if [ "$CURRENT_USAGE " -ge "$THRESHOLD " ]; then echo "警告: 磁盘设备 $DISK_DEVICE 的空间使用率超过 $CURRENT_USAGE %, 请登录服务器 ($IP_ADDRESS ) 及时清理文件." | mail -s "磁盘空间告警" $EMAIL 2>/dev/null fi
1 sudo chmod 755 /opt/disk_monitor.sh
1 sudo bash /opt/disk_monitor.sh
提示
如果只希望监控根目录(/)的磁盘使用率,可以使用命令 df -h / | awk 'NR==2 {print $5}' | sed 's/%//g'。 如果有多个邮件接收者,可以将上述代码更改为 EMAIL="example1@qq.com example2@qq.com,多个邮箱地址之间使用空格分隔,mail 命令支持将邮件发送给 EMAIL 变量中的所有接收者。 定时检测 编辑用户的 crontab 文件(这里使用 root 用户) 添加定时任务(比如每 30 分钟执行一次磁盘使用率检测) 1 */30 * * * * /opt/disk_monitor.sh
验证检测 1 2 sudo tail -f -n 50 /tmp/disk_monitor.log
1 2023-01-15 21:15:30 磁盘设备 /dev/sda1 的使用率为 85%
参考资料