巡检-域名-过期时间-钉钉通知
ding_domains_check.sh
通过脚本巡检即将到期的域名,并发送钉钉群
只需要修改钉钉机器人tocken
巡检内容地址为:/data/domains_list,格式为域名+空格备注(liwork.cn 博客网站)
效果示意:
执行命令:
sh ding_domains_check.sh
代码内容
#!/bin/bash
# 域名注册到期时间巡检脚本(增强版)
echo '开始检查域名注册到期时间'
# 初始化文件
RESULT_FILE="/data/https_lists"
DOMAIN_LIST="/data/https_list"
echo '' > "$RESULT_FILE"
source /etc/profile
# 钉钉机器人配置
DINGDING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=***"
# 定义错误域名和备注
errorDominStr=""
notes=""
# 增强版WHOIS日期解析函数
get_expiry_date() {
domain=$1
local retry=0
local whois_output=""
local expiry_date=""
# 尝试不同WHOIS服务器
while [ $retry -lt 2 ]; do
case $retry in
0)
whois_output=$(timeout 15 whois "$domain" 2>/dev/null)
;;
1)
# 对.com域名使用verisign服务器
if [[ "$domain" =~ .com$ ]]; then
whois_output=$(timeout 15 whois -h whois.verisign-grs.com "$domain" 2>/dev/null)
fi
;;
esac
# 尝试多种日期匹配模式
expiry_date=$(echo "$whois_output" | grep -i -P 'expir(ation|y)|renewal|registry.*expir' | grep -v '^#' | tail -1)
# 提取日期部分(兼容带T和Z的情况)
expiry_date=$(echo "$expiry_date" | grep -oP '\d{4}[-/]\d{2}[-/]\d{2}(T\d{2}:\d{2}:\d{2}Z)?' | head -1)
# 转换日期格式
if [ -n "$expiry_date" ]; then
# 替换可能的斜杠分隔符
expiry_date=$(echo "$expiry_date" | tr '/' '-')
# 处理UTC时间
if [[ "$expiry_date" == *"T"* ]]; then
expiry_date=$(date -u -d "$expiry_date" "+%Y-%m-%d" 2>/dev/null)
else
expiry_date=$(date -u -d "$expiry_date" "+%Y-%m-%d" 2>/dev/null)
fi
[ -n "$expiry_date" ] && break
fi
((retry++))
done
if [ -z "$expiry_date" ]; then
echo "无法解析日期" >&2
return 1
fi
echo "$expiry_date"
return 0
}
while read line; do
domain=$(echo $line | awk '{print $1}') # 提取域名
note=$(echo $line | awk '{$1="";print $0}' | sed 's/^[[:space:]]*//') # 提取备注
echo "====================================================================================="
echo "当前检测的域名:$domain"
# 获取域名到期日期
expiry_date=$(get_expiry_date "$domain")
if [ $? -ne 0 ] || [ -z "$expiry_date" ]; then
echo "[警告] 无法获取域名到期日期,跳过"
continue
fi
# 计算剩余天数(UTC基准)
expiry_timestamp=$(date -u -d "$expiry_date" +%s 2>/dev/null)
current_timestamp=$(date -u +%s)
if [ -z "$expiry_timestamp" ]; then
echo "[错误] 日期格式无效: $expiry_date"
continue
fi
if [ $expiry_timestamp -le $current_timestamp ]; then
days=0
else
days=$(( (expiry_timestamp - current_timestamp) / 86400 ))
fi
echo "域名到期日期(UTC): $expiry_date"
echo "剩余天数: $days"
# 告警阈值(可调整)
if [ $days -lt 3000 ]; then
echo "[紧急] 域名将在15天内过期!"
echo "$domain" >> "$RESULT_FILE"
# 转换中文日期格式
expiry_cn=$(date -d "$expiry_date" '+%Y年%m月%d日' 2>/dev/null || echo "$expiry_date")
notes+="\n域名:$domain 过期时间:$expiry_cn(剩余${days}天)备注:$note"
fi
done < "$DOMAIN_LIST"
# 发送钉钉通知
if [ -n "$notes" ]; then
curl -s "$DINGDING_WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\",\"text\": {\"content\":\"【域名过期预警】以下域名即将过期:$notes\"}}"
echo "告警钉钉已发送"
else
echo "没有检测到即将过期的域名"
fi
评论
其他文章