shell编程-案例
文章目录
- 前言
- 1、环境准备
- 1.1 配置系统邮件发送功能
- 1.2 安装证书
- 2、QQ邮箱配置
- 2.1 开启SMTP服务
- 2.2 获取授权码
- 3、证书配置
- 4、mailx配置
- 5、脚本
- 5.1 监控系统中的cpu、内存、硬盘使用率超过80%进行邮件告警
- 5.2 监控系统中的IO await大于50进行邮件告警
- 5.3 监控系统中的网络流量下载上传超过10M进行邮件告警
前言
shell脚本需求说明:
1、监控系统中的cpu、内存、硬盘使用率超过80%进行邮件告警(可使用邮箱163、QQ、139等)
2、监控系统中的IO await大于50进行邮件告警(可使用邮箱163、QQ、139等)
3、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警(可使用邮箱163、QQ、139等)
1、环境准备
1.1 配置系统邮件发送功能
## 安装mailx
sudo yum install mailx -y
## 查看版本
mailx -v
1.2 安装证书
yum install nss-tools openssl -y
2、QQ邮箱配置
2.1 开启SMTP服务
- 登录QQ邮箱 → 设置 → 账号与安全
- 找到"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"
- 开启"SMTP服务"
2.2 获取授权码
开启 SMTP 服务后,根据系统提示生成专属授权码
注意授权码不能泄露,可能会有安全隐患
3、证书配置
NSS(Network Security Services)数据库在配置mailx邮件发送功能时,主要用于管理加密通信所需的证书和密钥。通过NSS数据库,可以确保邮件传输过程中的安全性和身份验证
## 创建证书目录
mkdir -p /etc/pki/nssdb
## 设置空密码直接按回车
certutil -N -d /etc/pki/nssdb
4、mailx配置
证书配置
# 获取QQ邮箱465端口的SSL证书
echo -n | openssl s_client -connect smtp.qq.com:465 -servername smtp.qq.com | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/qq_465.crt# 导入证书到NSS数据库
certutil -A -n "QQ Mail SSL Certificate (465)" -t "P,," -i /tmp/qq_465.crt -d /etc/pki/nssdb
mailx配置
sudo vim /etc/mail.rc
## 465端口配置(SSL加密)
## 发件人邮箱地址,用于设置邮件的发件人信息
set from=你的QQ邮箱@qq.com
## SMTP服务器地址,使用smtps协议和465端口(SSL加密连接)
set smtp=smtps://smtp.qq.com:465
## SMTP认证用户名,填写QQ邮箱地址
set smtp-auth-user=你的QQ邮箱@qq.com
## SMTP认证密码,此处填入QQ邮箱生成的授权码(非登录密码)
set smtp-auth-password=你的授权码
## SMTP认证方式,login表示使用用户名密码认证
set smtp-auth=login
## SSL证书验证设置,ignore表示忽略证书验证(测试环境使用,生产环境建议配置正确证书)
set ssl-verify=ignore
## NSS证书数据库路径,指向之前创建的证书存储目录
set nss-config-dir=/etc/pki/nssdb/
邮箱测试
echo "这是一封测试邮件,用于验证邮箱配置是否成功。" | mail -s "邮箱配置测试" 你的邮箱@qq.com
5、脚本
5.1 监控系统中的cpu、内存、硬盘使用率超过80%进行邮件告警
#!/bin/bash# 获取当前时间
DATE=$(date "+%Y-%m-%d %H:%M:%S")# 1. 获取CPU使用率(取1秒内的平均值,避免立即返回0)CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}')# 2. 获取内存使用率MEM_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')# 3. 获取根分区(/)磁盘使用率
DISK_USAGE=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')# 设置阈值
THRESHOLD=80# 告警标志和消息体
ALERT_FLAG=0
ALERT_MSG=""# 判断CPU
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); thenALERT_FLAG=1ALERT_MSG="$ALERT_MSG CPU 使用率: ${CPU_USAGE}% > ${THRESHOLD}%\n"
fi# 判断内存
if (( $(echo "$MEM_USAGE > $THRESHOLD" | bc -l) )); thenALERT_FLAG=1ALERT_MSG="$ALERT_MSG 内存 使用率: ${MEM_USAGE}% > ${THRESHOLD}%\n"
fi# 判断硬盘
if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; thenALERT_FLAG=1ALERT_MSG="$ALERT_MSG 根分区磁盘 使用率: ${DISK_USAGE}% > ${THRESHOLD}%\n"
fi# 如果任何一项超标,则发送邮件
if [ $ALERT_FLAG -eq 1 ]; thenecho -e "【系统告警】服务器资源使用超限!\n\n告警时间:$DATE\n$ALERT_MSG\n请及时处理!" | mailx -s "【系统告警】$(hostname) 资源使用率超过 ${THRESHOLD}%" @qq.com
fi
5.2 监控系统中的IO await大于50进行邮件告警
#!/bin/bash# 设置阈值
IOMax=50
# 获取当前时间
DATE=$(date "+%Y-%m-%d %H:%M:%S")
# 消息体
ALERT_MSG=""# 使用 iostat -x 获取sda设备的IO使用率
IOLimit=$(iostat -x | awk '/sda/ {print $NF}' | tail -1)# 判断是否超过阈值
if [[ $IOLimit > $IOMax ]]; thenALERT_MSG="IO使用率: ${IOLimit}% > ${IOMax}%"echo -e "【系统告警】IO使用率超限!\n\n告警时间:$DATE\n$ALERT_MSG\n请及时处理!" | mailx -s "【系统告警】$(hostname) IO使用率超过 ${IOMax}%" @qq.com
fi
5.3 监控系统中的网络流量下载上传超过10M进行邮件告警
#!/bin/bash# 配置参数
INTERFACE="ens33" # 请替换为你的网卡名
THRESHOLD_MB=10
THRESHOLD_BPS=$(( THRESHOLD_MB * 1024 * 1024 ))# 获取当前流量统计 (接收和发送的字节数)
RX_BYTES_OLD=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX_BYTES_OLD=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)# 等待1秒
sleep 1# 再次获取流量统计
RX_BYTES_NEW=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
TX_BYTES_NEW=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)# 计算1秒内的速率 (Bytes per Second)
RX_BPS=$(( (RX_BYTES_NEW - RX_BYTES_OLD) ))
TX_BPS=$(( (TX_BYTES_NEW - TX_BYTES_OLD) ))# 转换为 MB/s (用于显示和比较)
RX_MBPS=$(echo "scale=2; $RX_BPS / 1024 / 1024" | bc)
TX_MBPS=$(echo "scale=2; $TX_BPS / 1024 / 1024" | bc)# 检查是否超过阈值
HOSTNAME=$(hostname)
ALERT=false
MESSAGE=""if (( $(echo "$RX_BPS > $THRESHOLD_BPS" | bc -l) )); thenALERT=trueMESSAGE="$MESSAGE 流入流量: ${RX_MBPS} MB/s > ${THRESHOLD_MB} MB/s"
fiif (( $(echo "$TX_BPS > $THRESHOLD_BPS" | bc -l) )); thenALERT=trueMESSAGE="$MESSAGE 流出流量: ${TX_MBPS} MB/s > ${THRESHOLD_MB} MB/s"
fi# 如果超过阈值,发送邮件
if [ "$ALERT" = true ]; thenecho "警告:服务器 $HOSTNAME 的网卡 $INTERFACE 流量过高。$MESSAGE 时间:$(date)" | mail -s "【紧急】网络流量告警 - $HOSTNAME" @qq.com
fi