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