#!/bin/bash
# by wangjiangyuan
# 批量检测CNAME 到期脚本
# 定义一个函数,用于提取域名信息并写入 CSV 文件
function process_domains {
# 获取当前日期和时间(格式为YYYY-MM-DD-HHMMSS)
current_datetime=$(date +"%Y-%m-%d-%H%M%S")
# CSV文件名中包含当前日期和时间和操作域名
output_file="ssl_info_${current_datetime}.csv"
# 添加CSV文件的列标题
echo "域名,SSL 过期日期,CNAME 地址,CDN 厂商" > "$output_file"
# 逐行读取文件并提取域名和 SSL 过期日期,写入CSV文件
while read -r line; do
domain=$(echo "$line" | awk '{print $2}')
expiration=$(echo "$line" | awk '{print $6, $7, $8, $9}')
cname=$(dig "$domain" | grep -m 2 "ANSWER SECTION" -A 1 | awk 'NR==2 {print $5}')
# 提取CDN CNAME 后缀
suffix=$(echo $cname | awk -F'.' '{print $(NF-2)"."$(NF-1)}')
case "$cname" in
*"kunlun"*)
cdn_vendor="阿里云";;
*"cdngslb.com"*)
cdn_vendor="阿里云";;
*"tc.cdntip.com"*)
cdn_vendor="腾讯云";;
*"spcdntip.com"*)
cdn_vendor="腾讯云";;
*"dnsv1.com"*)
cdn_vendor="腾讯云";;
*"wscdns.com"*)
cdn_vendor="网宿";;
*"lxcdn.com"*)
cdn_vendor="网宿";;
*"cdn20.com"*)
cdn_vendor="网宿";;
*"wswebcdn.com"*)
cdn_vendor="网宿";;
*"jomodns.com"*)
cdn_vendor="网宿";;
*"wswebpic.com"*)
cdn_vendor="网宿";;
*"wswebcdn.com"*)
cdn_vendor="百度云";;
*"ksyuncdn.com"*)
cdn_vendor="金山云";;
*"ks-cdn.com"*)
cdn_vendor="金山云";;
*"ks-cdn1.com"*)
cdn_vendor="金山云";;
*"cdnhwc2.com"*)
cdn_vendor="华为云";;
*"qingcdn.com"*)
cdn_vendor="白山云";;
*"trpcdn.net"*)
cdn_vendor="白山云";;
*"bsclink.cn"*)
cdn_vendor="白山云";;
*"qiniudns.com"*)
cdn_vendor="七牛云";;
*"aicdn.com"*)
cdn_vendor="又拍云";;
*"ccgslb.com.cn"*)
cdn_vendor="蓝汛";;
*"dwion.com"*)
cdn_vendor="帝联";;
*)
cdn_vendor="$suffix";;
esac
echo "$domain,$expiration,$cname,$cdn_vendor" >> "$output_file"
done < "$1"
echo "数据已成功导出到 $output_file"
}
# 检查位置变量是否为空
if [ -z "$1" ]; then
echo -e 'Usage: $0 <domain>\nPlease provide a domain name. and edit domain_list.txt'
exit 1
fi
# 定义当下年份变量
current_year=$(date +'%Y')
next_year=$((current_year + 1))
# 域名列表文件
domain_list="domain.ctxt"
# 结果输出文件
output_file="outputC.txt"
# 检查域名列表文件是否存在
if [ ! -f "$domain_list" ]; then
echo "Domain list file not found: $domain_list"
exit 1
fi
# 清空输出文件
> "$output_file"
# 读取域名列表文件中的每个域名并进行处理
for domain in $(cat "$domain_list"); do
full_domain="$domain.$1"
# echo -n "Processing domain: $full_domain" >> "$output_file"
#echo $full_domain
line=""
line+="Domain: $full_domain "
# 1. 导出 DNS 记录的 Name 和 Address 并输出在一行上,A记录检测使用
#echo -n " Name: $domain" >> "$output_file"
#echo " Address: $(dig +short $full_domain)" >> "$output_file"
#line+=" Name: $domain"
#line+=" Address: $(dig +short $full_domain)"
# 2. 检测端口 443 是否开放
if nc -zvw3 "$full_domain" 443; then
#echo "443: open " >> "$temp_file"
line+=" 443: open "
else
#echo "443: close " >> "$temp_file"
line+=" 443: close "
fi
# 3. 获取 SSL 证书过期日期 tr -d '\n' 去掉换行符
ssl_dates=$( echo |openssl s_client -connect "$full_domain":443 -servername "$full_domain" 2>/dev/null | openssl x509 -noout -dates | grep notAfte| tr -d '\n' )
#echo "SSL起始日期 $ssl_dates" >> "$temp_file"
line+="SSL $ssl_dates"
#echo $ssl_dates
# printf "%-50s\n" "$line" >> "$output_file"
echo "$line" >> "$output_file"
done
echo "批量处理完成,请查看输出文件:$output_file"
# 检测 ssl 证书到期时间是否等于等于今年
cat "$output_file" | grep -i "$current_year" | tee "$current_year.date.txt"
echo "检测完毕,'$current_year' 到期的证书已输出到 '$current_year.date.txt' 文件内"
# source ssl_info.sh "$current_year.date.txt"
# 调用函数并传入参数
process_domains "$current_year.date.txt"
使用方法:
脚本当前目录新建domain.ctxt 文件,将需要批量检测的 CAME 域名前缀按行填写进去,例如 www.baidu.com/bbs.baidu.com 、tieba.baidu.com 。
domain.ctxt文件内容为
www
bbs
tieba
执行方式
bash 脚本名称 一级域名
举例
bash check_ssl.sh baidu.com