CentOS 7 通过 Shell 脚本实现磁盘监控报警

大纲

前言

本文将介绍 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 证书

  • 导入 NSS 证书(这里使用 root 用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建用于存储证书的目录
sudo mkdir -p /root/.certs/

# 从 QQ 邮箱的 SMTP 服务器(端口 465)获取 SSL 证书链,并提取出证书部分(BEGIN/END 标记之间),保存到 qq-smtp.crt 文件
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"

# 将提取的证书中的 "GeoTrust SSL CA" 证书添加到 NSS 数据库(-d 指定目录),信任属性设置为 "C,,"(表示作为 CA 证书,但不用于客户端 / 服务器认证)
sudo certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/qq-smtp.crt

# 将提取的证书中的 "GeoTrust Global CA" 证书添加到 NSS 数据库,同样设置信任属性为 "C,,"
sudo certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/qq-smtp.crt

# 列出 NSS 数据库中所有已安装的证书,用于验证证书是否成功导入
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.com
set smtp="smtps://smtp.qq.com:465"
set smtp-auth-user=clay@qq.com
set smtp-auth-password=xxxxxxxxxxxx
set smtp-auth=login
set ssl-verify=ignore
set 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 证书和加密连接。

测试邮件发送

  • 测试邮件发送(这里使用 root 用户
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
IP_ADDRESS=$(curl -s https://checkip.amazonaws.com)

# 判断服务器的公网 IP 是否为空
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
  • 脚本测试执行(这里使用 root 用户
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 用户)
1
sudo crontab -e
  • 添加定时任务(比如每 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%

参考资料