大纲 前言 本文将介绍 Debian 13 系统如何使用 Shell 脚本,实现对磁盘使用率的监控,并发送告警邮件(支持腾讯企业邮箱或者 QQ 邮箱)。
准备工作 防火墙配置 防火墙开放 22 端口(避免 SSH 远程连接断开) 防火墙开放 465 端口(SMTPS,用于邮件发送) 启用防火墙(务必先开放 SSH 的 22 端口再启用防火墙 ) 安装邮件服务 1 2 3 4 5 sudo apt install s-nail -y sudo ln -s /usr/bin/s-nail /usr/bin/mail
1 sudo apt install libnss3-tools -y
1 2 3 4 5 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/s-nail.rc /etc/s-nail.rc.bak sudo vi /etc/s-nail.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"
如果邮件发送失败,可以通过添加 -v 参数输出详细的日志信息,然后进一步排查原因 1 sudo sh -c "echo 'TestMail~' | mail -v -s 'TestMail' xxx@qq.com"
脚本实现 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 39 #!/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 " >> $LOG_FILE echo "$(date '+%Y-%m-%d %H:%M:%S') 磁盘使用率: $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 变量中的所有接收者。 定时检测 提示
在 Debian 13 中,官方推荐使用 systemd 自带的 timer 功能取代传统的 cron 服务。当然,如果您更习惯 cron 的配置方式,也可以选择手动安装 cron 服务,然后使用 crontab -e 命令来管理定时任务。
1 2 3 4 5 6 7 8 9 sudo vi /etc/systemd/system/disk-monitor.service [Unit] Description=Disk Monitoring Service [Service] Type=oneshot ExecStart=/opt/disk_monitor.sh
创建磁盘监控的定时器单元(比如每 30 分钟执行一次磁盘使用率检测) 1 2 3 4 5 6 7 8 9 10 11 12 sudo vi /etc/systemd/system/disk-monitor.timer [Unit] Description=Run disk monitor every 30 minutes [Timer] OnCalendar=*:0/30 Persistent=true [Install] WantedBy=timers.target
1 2 3 4 5 sudo systemctl daemon-reload sudo systemctl enable --now disk-monitor.timer
1 sudo systemctl list-timers --all
参考资料