本文目录导读:

我来详细介绍几种Shell脚本监控域名解析记录的方法:
基础DNS解析监控脚本
#!/bin/bash
# DNS监控脚本 - 检查域名解析是否正常
DOMAIN="example.com"
DNS_SERVER="8.8.8.8" # 可选DNS服务器
# 获取当前解析IP
CURRENT_IP=$(dig +short $DOMAIN @$DNS_SERVER | tail -n1)
# 或使用nslookup
# CURRENT_IP=$(nslookup $DOMAIN | grep 'Address:' | tail -n1 | awk '{print $2}')
# 或使用host命令
# CURRENT_IP=$(host $DOMAIN | grep 'has address' | awk '{print $4}')
echo "当前解析: $CURRENT_IP"
带解析记录日志的监控脚本
#!/bin/bash
# 配置变量
DOMAIN="example.com"
EXPECTED_IP="192.168.1.100" # 期望的IP地址
LOG_FILE="/var/log/dns_monitor.log"
CHECK_INTERVAL=300 # 检查间隔(秒)
# 日志函数
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# 获取解析记录
get_dns_record() {
dig +short $DOMAIN @8.8.8.8 | tail -n1
}
# 主监控函数
monitor_dns() {
log_message "开始监控域名: $DOMAIN"
while true; do
CURRENT_IP=$(get_dns_record)
if [ -z "$CURRENT_IP" ]; then
log_message "WARNING: 无法解析域名 $DOMAIN"
elif [ "$CURRENT_IP" != "$EXPECTED_IP" ]; then
log_message "ALERT: DNS解析发生变化!"
log_message "原记录: $EXPECTED_IP"
log_message "新记录: $CURRENT_IP"
# 发送通知(可选)
# send_alert "$CURRENT_IP"
else
log_message "正常 - 解析: $CURRENT_IP"
fi
sleep $CHECK_INTERVAL
done
}
# 发送告警通知
send_alert() {
local new_ip=$1
# 邮件通知
# echo "域名 $DOMAIN DNS记录已更改至 $new_ip" | mail -s "DNS变更告警" admin@example.com
# Webhook通知
# curl -X POST -H "Content-Type: application/json" \
# -d "{\"domain\":\"$DOMAIN\",\"new_ip\":\"$new_ip\"}" \
# https://hooks.example.com/alert
}
# 启动监控
monitor_dns
多域名批量监控脚本
#!/bin/bash
# 域名列表文件
DOMAIN_LIST="/etc/dns_monitor/domains.txt"
# 格式: domain|expected_ip
# example.com|192.168.1.100
# google.com|8.8.8.8
RESULT_FILE="/tmp/dns_check_result.txt"
ALERT_EMAIL="admin@example.com"
# 检查单个域名
check_domain() {
local domain=$1
local expected_ip=$2
# 使用多个DNS服务器提高可靠性
local dns_servers=("8.8.8.8" "1.1.1.1" "114.114.114.114")
local resolved_ip=""
for dns in "${dns_servers[@]}"; do
resolved_ip=$(dig +short $domain @$dns 2>/dev/null | tail -n1)
if [ -n "$resolved_ip" ]; then
break
fi
done
# 检查域名是否解析成功
if [ -z "$resolved_ip" ]; then
echo "FAIL|$domain|无法解析"
return 1
fi
# 检查是否匹配期望IP
if [ "$resolved_ip" != "$expected_ip" ]; then
echo "CHANGED|$domain|$expected_ip->$resolved_ip"
return 2
fi
echo "OK|$domain|$resolved_ip"
return 0
}
# 批量检查所有域名
check_all_domains() {
echo "开始检查域名解析状态..."
echo "=== DNS检查报告 $(date) ===" > $RESULT_FILE
while IFS='|' read -r domain expected_ip; do
# 跳过注释和空行
[[ $domain =~ ^# ]] && continue
[ -z "$domain" ] && continue
result=$(check_domain "$domain" "$expected_ip")
echo "$result" >> $RESULT_FILE
# 解析结果状态
status=$(echo $result | cut -d'|' -f1)
if [ "$status" != "OK" ]; then
echo "WARNING: $domain - $status"
fi
done < "$DOMAIN_LIST"
echo "检查完成,结果已保存至: $RESULT_FILE"
}
# 生成HTML报告
generate_html_report() {
local html_file="/tmp/dns_report_$(date +%Y%m%d).html"
cat > $html_file << EOF
<!DOCTYPE html>
<html>
<head>DNS监控报告</title>
<style>
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
.OK { color: green; }
.FAIL { color: red; }
.CHANGED { color: orange; }
</style>
</head>
<body>
<h1>DNS监控报告 - $(date)</h1>
<table>
<tr>
<th>状态</th>
<th>域名</th>
<th>当前解析</th>
<th>期望解析</th>
</tr>
EOF
while IFS='|' read -r status domain ip_info; do
[ "$status" = "===" ] && continue
echo "<tr class='$status'>" >> $html_file
echo "<td>$status</td>" >> $html_file
echo "<td>$domain</td>" >> $html_file
echo "<td>$ip_info</td>" >> $html_file
echo "</tr>" >> $html_file
done < $RESULT_FILE
echo "</table></body></html>" >> $html_file
echo "HTML报告已生成: $html_file"
}
# 主函数
main() {
check_all_domains
# 检查是否有异常
if grep -q "FAIL\|CHANGED" $RESULT_FILE; then
echo "发现DNS异常,发送告警..."
generate_html_report
# 发送邮件通知
# mail -s "DNS监控告警" $ALERT_EMAIL < $RESULT_FILE
else
echo "所有域名解析正常"
fi
}
main
支持CNAME和MX记录的监控
#!/bin/bash
# 监控多种DNS记录类型
monitor_all_records() {
local domain="example.com"
echo "=== DNS记录监控 ==="
echo "域名: $domain"
echo "检查时间: $(date)"
echo "------------------------"
# 检查A记录
echo "A记录:"
dig +short A $domain
# 检查AAAA记录(IPv6)
echo "AAAA记录 (IPv6):"
dig +short AAAA $domain
# 检查CNAME记录
echo "CNAME记录:"
dig +short CNAME $domain
# 检查MX记录
echo "MX记录:"
dig +short MX $domain | sort
# 检查NS记录
echo "NS记录:"
dig +short NS $domain | sort
# 检查TXT记录
echo "TXT记录:"
dig +short TXT $domain
echo "------------------------"
}
# 检测DNS记录变更
detect_dns_changes() {
local domain=$1
local record_type=${2:-"A"}
local history_file="/tmp/dns_history_${domain}_${record_type}.txt"
# 获取当前记录
current_record=$(dig +short $record_type $domain | sort | tr '\n' ' ')
# 检查历史文件
if [ -f "$history_file" ]; then
previous_record=$(cat $history_file)
if [ "$current_record" != "$previous_record" ]; then
echo "检测到 $domain 的 $record_type 记录变更!"
echo "之前: $previous_record"
echo " $current_record"
# 更新历史记录
echo "$current_record" > $history_file
return 1
fi
else
# 首次运行,保存记录
echo "$current_record" > $history_file
echo "初始化 $domain 的 $record_type 记录: $current_record"
fi
return 0
}
# 使用示例
monitor_all_records
detect_dns_changes "example.com" "A"
detect_dns_changes "example.com" "MX"
系统服务化配置
创建systemd服务文件 /etc/systemd/system/dns-monitor.service:
[Unit] Description=DNS Monitoring Service After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/dns_monitor.sh Restart=always RestartSec=30 [Install] WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload sudo systemctl enable dns-monitor sudo systemctl start dns-monitor
使用建议
- 增强可靠性:使用多个DNS服务器
- 缓存策略:注意本地DNS缓存
- 告警机制:集成邮件、Slack、钉钉等通知
- 日志管理:实施日志轮转策略
- 性能优化:使用超时控制
这些脚本可以根据实际需求进行定制和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播