linux shell脚本硬件定时检测通过邮箱警告管理人员
1.注意事项
将等号后面英文双引号内的换为你的邮箱地址,邮箱授权码请去对应的邮箱获取
MAIL_FROM="3489402847@qq.com" #发件人邮箱
MAIL_TO="3489402847@qq.com" # 收件人邮箱
SMTP_SERVER="smtp.qq.com" # QQ邮箱SMTP服务器
SMTP_PORT="465" # SSL加密端口
SMTP_USER="3489402847@qq.com" # 邮箱账号
SMTP_PASSWORD="**************" # 邮箱授权码
注:与注解相同颜色的邮箱字段需要替换成你的邮箱
温馨提醒:请仔细阅读完后再开始使用脚本
2.邮箱授权码获取流程
以下为获取授权码的流程图:
由于我是腾讯的邮箱,这里仅展示QQ邮箱
图1
图2
图3
3.shell脚本
#!/bin/bash
# 作者:PEI
# 硬件监控告警脚本(使用curl发送邮件,100%可靠)
# 功能:监控CPU(5分钟平均)、内存、磁盘使用率,超过90%、70%、70%时通过邮件告警#从自己的邮箱发到自己的邮箱里
MAIL_FROM="3489402847@qq.com" # 发件人邮箱
MAIL_TO="3489402847@qq.com" # 收件人邮箱
SMTP_SERVER="smtp.qq.com" # QQ邮箱SMTP服务器
SMTP_PORT="465" # SSL加密端口
SMTP_USER="3489402847@qq.com" # 邮箱账号
SMTP_PASSWORD="**************" # 邮箱授权码#切换阿里云
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache#安装sendmail软件
yum install sendemail -y# 证书路径
CERT_DIR="$HOME/user"
mkdir -p "$CERT_DIR"
CERT_FILE="$CERT_DIR/qq_smtp.crt"# 监控阈值(百分比)
THRESHOLD=90 # CPU阈值
NEICUNHOLD=70 # 内存阈值
CIPANHOLD=70 # 磁盘阈值# 临时邮件文件路径
MAIL_FILE="/tmp/hw_alert_mail.txt"# =====================================================================# 函数:获取并验证SSL证书
fetch_and_validate_cert() {# 如果证书文件已存在且有效,则直接使用if [ -f "$CERT_FILE" ]; thenif openssl x509 -in "$CERT_FILE" -noout -checkend 0 >/dev/null 2>&1; thenecho "使用有效的现有证书: $CERT_FILE"return 0elseecho "证书已过期,重新获取..."fifi# 获取新的证书echo "获取QQ邮箱SSL证书..."if ! openssl s_client -showcerts -connect "$SMTP_SERVER:$SMTP_PORT" </dev/null 2>/dev/null | \sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > "$CERT_FILE.tmp"thenecho "错误:无法从服务器获取证书" >&2return 1fi# 验证证书格式if ! openssl x509 -in "$CERT_FILE.tmp" -noout >/dev/null 2>&1; thenecho "错误:获取的证书格式无效" >&2rm -f "$CERT_FILE.tmp"return 1fi# 移动临时证书到正式位置mv "$CERT_FILE.tmp" "$CERT_FILE"echo "证书已保存到: $CERT_FILE"return 0
}# 确保有可用的证书
if ! fetch_and_validate_cert; thenecho "无法获取有效的SSL证书,邮件发送将失败" >&2exit 1
fi# 创建邮件内容
cat > $MAIL_FILE << EOF
From: $MAIL_FROM
To: $MAIL_TO
Subject: 服务器硬件资源告警
Content-Type: text/html; charset=utf-8<html>
<body>
<h2>服务器硬件资源告警</h2>
<p>以下资源使用率超过特定的百分比:</p>
<pre style='font-family: monospace;'>
EOF# 检查CPU使用率(5分钟平均)
load_average=$(uptime | awk -F 'average: ' '{print $2}' | awk -F, '{print $2}' | sed 's/ //g')
cpu_cores=$(nproc)
load_percent=$(echo "scale=2; ($load_average * 100) / $cpu_cores" | bc)# 检查CPU负载是否超过阈值
if [ $(echo "$load_percent >= $THRESHOLD" | bc) -eq 1 ]; thenecho "[!] CPU负载过高(5分钟平均): $(printf "%.1f" $load_percent)%" >> $MAIL_FILE
fi# 检查内存使用率
mem_usage=$(free | awk '/Mem/ {printf "%.1f", $3/$2 * 100.0}')
if [ $(echo "$mem_usage >= $NEICUNHOLD" | bc) -eq 1 ]; thenecho "[!] 内存使用率过高: ${mem_usage}%" >> $MAIL_FILE
fi# 检查磁盘使用率
df -Ph | awk 'NR>1 && !/tmpfs|cdrom|udev/ {print $5, $6}' | while read usage partition; dousage_val=${usage%%%}if [[ $usage_val =~ ^[0-9]+$ ]]; thenif [ $usage_val -ge $CIPANHOLD ]; thenecho "[!] 磁盘分区 $partition 使用过高: ${usage_val}%" >> $MAIL_FILEfifi
done# 如果没有告警则退出
if [ $(grep -c '\[!\]' $MAIL_FILE) -eq 0 ]; thenrm -f $MAIL_FILEexit 0
fi# 添加系统信息摘要
cat >> $MAIL_FILE << EOF
</pre>
<hr>
<h3>系统概览:</h3>
<pre style='font-family: monospace;'>
主机名: $(hostname)
IP地址: $(hostname -I | awk '{print $1}')
时间: $(date)
运行时间: $(uptime -p)# CPU负载情况(5分钟平均)负载值: $load_average负载百分比: ${load_percent}%CPU核心数: $cpu_cores# 内存使用情况
$(free -h | sed 's/^/ /')# 磁盘使用情况
$(df -Ph | sed 's/^/ /')
</pre>
</body>
</html>
EOF# 使用curl发送邮件(使用SSL证书验证)
response=$(curl -s --url "smtps://$SMTP_SERVER:$SMTP_PORT" \--cacert "$CERT_FILE" \--mail-from "$MAIL_FROM" \--mail-rcpt "$MAIL_TO" \--user "$SMTP_USER:$SMTP_PASSWORD" \--upload-file $MAIL_FILE 2>&1)# 检查发送结果
if [ $? -eq 0 ]; thenecho "邮件发送成功"rm -f $MAIL_FILE
elseecho "邮件发送失败: $response" >&2echo "邮件内容保留在: $MAIL_FILE"echo "证书路径: $CERT_FILE"echo "证书内容:"cat "$CERT_FILE"
fi
4.使用须知
注:第一次运行需要脚本中有以下这两项
在后续不需要这两项,删除即可,
#切换阿里云
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache#安装sendmail软件
yum install sendemail -y
-
将脚本保存为
server_monitor_final.sh
-
给予执行权限:
chmod +x server_monitor_final.sh
-
运行脚本:
在定时方面使用./server_monitor_final.sh
-
配置定时任务(每5分钟运行一次):
crontab -e
在配置下面的路径时需要配置绝对路径(路径以实际为准)
*/5 * * * * /path/to/server_monitor.sh
5.效果如图
邮件内容: