首页 > 其他分享 >通过BASH脚本实现DNS优选

通过BASH脚本实现DNS优选

时间:2024-05-16 21:43:19浏览次数:17  
标签:domain 优选 DNS ips host file local BASH log

0 2 * * * /root/mysqlbeifen.sh
*/10 * * * * /root/dns_update.sh






#!/bin/bash

LOG_DIR="/var/log/dns_script"
HOST_FILE="/etc/hosts_NC"
DOMAIN="sso.ccnhub.com"
DNS_SERVER="114.114.114.114"  # Replace with your DNS server IP

log() {
  local log_file="$LOG_DIR/$(date +\%Y-\%m-\%d).log"
  echo "$(date +\%Y-\%m-\%d\ \%H:\%M:\%S) - $1" >> "$log_file"
}

get_dns_ips() {
  local domain="$1"
  local dns_server="$2"
  local resolved_ips

  resolved_ips=$(nslookup "$domain" "$dns_server" | awk '/^Address: / {print $2}')

  if [ -z "$resolved_ips" ]; then
    log "域名 $domain 的DNS解析失败。请检查DNS配置或域名是否存在。检测IP后脚本停止执行"
        host_file_ips2=($(get_host_file_ips "$DOMAIN"))  #重新读取HOSTS文件
        ping_and_remove_unreachable "$HOST_FILE" "$DOMAIN" "${host_file_ips2[@]}"

    exit 1

  fi

  # Filter out IPv6 addresses
  resolved_ips=$(echo "$resolved_ips" | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}")

  echo "$resolved_ips"
}

get_host_file_ips() {
  local domain="$1"
  local host_ips

  host_ips=$(awk -v d="$domain" '$2==d {print $1}' "$HOST_FILE")

  if [ -z "$host_ips" ]; then
    log "在$HOST_FILE中未找到$domain的条目。请检查Hosts文件是否正确。"
    exit 1
  fi

  echo "$host_ips"
}

delete_host_file_entry() {
  local host_file="$1"
  local domain="$2"
  shift 2
  local ips_to_delete=("$@")

  # Check if the array is empty
  if [ "${#ips_to_delete[@]}" -eq 0 ]; then
    echo "数组为空,不执行删除操作。"
    return
  fi

  # Remove entries with the specified IP and domain
  for ip in "${ips_to_delete[@]}"; do
    sed -i -e "/^[[:space:]]*$ip[[:space:]]*$domain[[:space:]]*$/d" "$host_file"
    log "$ip $domain 为过期IP,已经从HOSTS文件删除。"
  done
}

update_host_file() {
  local host_file="$1"
  local domain="$2"
  shift 2
  local ips_to_update=("$@")

  # Check if the array is empty
  if [ "${#ips_to_update[@]}" -eq 0 ]; then
    echo "数组为空,不执行插入操作。"
    return
  fi

  # Remove existing entries with the specified domain
  #sed -i -e "/^[[:space:]]*${ips_to_update[0]}[[:space:]]*$domain[[:space:]]*$/d" "$host_file"

  # Append new IPs to the file
  for ip in "${ips_to_update[@]}"; do


   # if ping -c 1 "$ip" &> /dev/null; then
   if  nc -z -w 1 "$ip" 443 &> /dev/null; then

      echo "$ip $domain" >> "$host_file"
      log "$ip 新IP的NC端口检测成功。执行插入"

    else


      log "$ip 的Ping测试失败。不执行插入操作"
    fi



  done
}

ping_and_remove_unreachable() {
  local host_file="$1"
  local domain="$2"
  local host_ips=("${@:3}")

  for ip in "${host_ips[@]}"; do
    #if ping -c 1 "$ip" &> /dev/null; then
    if nc -z -w 1 "$ip" 443  &> /dev/null; then
      log "$ip 的Ping测试成功。"
    else

      sed -i -e "/^[[:space:]]*$ip[[:space:]]*$domain[[:space:]]*$/d" "$host_file"
      log "$ip 的Ping测试失败。已从$host_file中移除该条目。"
    fi
  done
}

initialize_log_directory() {
  if [ ! -d "$LOG_DIR" ]; then
    mkdir -p "$LOG_DIR"
  fi
}

main() {
  initialize_log_directory

  log "脚本执行开始。"

  # 通过DNS解析获取域名的IP地址
  dns_ips=($(get_dns_ips "$DOMAIN" "$DNS_SERVER"))
         # 检查 resolve_domain 的返回值
        if [ $? -ne 0 ]; then
                # resolve_domain 返回非零,说明出错,直接退出脚本
                log "DNS解析失败。退出整体脚本。"
         exit 1
        fi

  # 通过Host文件获取已有的IP地址
  host_file_ips=($(get_host_file_ips "$DOMAIN"))

  # 寻找Host文件中有而DNS解析中没有的IP
  missing_ips=($(comm -23 <(printf "%s\n" "${host_file_ips[@]}" | sort) <(printf "%s\n" "${dns_ips[@]}" | sort)))

  # 删除Host文件中多余的IP
  delete_host_file_entry "$HOST_FILE" "$DOMAIN" "${missing_ips[@]}"

  # 寻找DNS解析中有而Host文件中没有的IP
  missing_ips2=($(comm -23 <(printf "%s\n" "${dns_ips[@]}" | sort) <(printf "%s\n" "${host_file_ips[@]}" | sort)))

  # 插入更新Host文件中的IP,插入前检测
  update_host_file "$HOST_FILE" "$DOMAIN" "${missing_ips2[@]}"

  # 执行循环NC端口检测,发现不可达的IP,从Host文件中删除相应的记录
  #ping_and_remove_unreachable "$HOST_FILE" "$DOMAIN" "${host_file_ips[@]}"  #已经当作多余IP清理掉,不用重复
  host_file_ips2=($(get_host_file_ips "$DOMAIN"))  #重新读取HOSTS文件
  ping_and_remove_unreachable "$HOST_FILE" "$DOMAIN" "${host_file_ips2[@]}"

  log "脚本执行完成。"

  # 清理旧的日志文件(保留3天的日志)
  find "$LOG_DIR" -name "*.log" -mtime +3 -exec rm {} \;
}

main

 

 

 

cat /etc/hosts_NC



127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
61.14.138.136 sso.ccnhub.com
203.116.74.71 sso.ccnhub.com
58.185.85.222 sso.ccnhub.com
You have new mail in /var/spool/mail/root

 

标签:domain,优选,DNS,ips,host,file,local,BASH,log
From: https://www.cnblogs.com/aldary/p/18196795

相关文章

  • bash脚本监控服务器SSH登录,每30分钟运行一次,发现登录发送到企业微信群
    //开始循环检测//loopCheck();//在每分钟的第30秒执行目标函数cron.schedule('358***',()=>{console.log('目标函数在8:35执行!');loopCheck_info();//在这里调用你想要定时执行的函数});cron.schedule('*/309-20***',()=>{con......
  • [shell:bash] ubuntu_remove_old_kernel_test
    [shell:bash]  ubuntu_remove_old_kernel_test    一、基本信息 1、os:Linuxubuntu6.5.0-35-generic#35-UbuntuSMPPREEMPT_DYNAMICFriApr2611:23:57UTC2024x86_64x86_64x86_64GNU/Linux 2、bash:GNUbash,version5.2.......
  • Linux错误:-bash: Su: command not found
     问题:使用su命令出错:-bash:Su:commandnotfound 解决:先查看/etc/sudoers.d文件是否存在find/etc/sudoers.d说明系统已经安装了sudo,只不过没有配置环境。解决一:使用vi或vim以下命令打开/etc/sudoers文件。vim/etc/sudoers esc-->:......
  • root用户登陆ssh报错 /bin/bash: Permission denied
    CentOS7.5 ssh服务升级后,sshd服务状态正常,root用户登陆成功Xshell7(Build0157)Copyright(c)2020NetSarangComputer,Inc.Allrightsreserved.Type`help'tolearnhowtouseXshellprompt.[C:\~]$Connectingto127.0.0.1:XXXXX...Connectionestablished......
  • DNS原理及解析过程
    DNS(DomainNameSystem,域名系统)是一个将域名转换为IP地址的分布式数据库系统,它使得人们可以通过易于记忆的域名来访问互联网资源,而不是使用难以记忆的IP地址。以下是DNS的基本原理及解析过程:DNS原理分布式数据库:DNS是一个分布式数据库,由多个DNS服务器组成,这些服务器分布在互联......
  • 在Linux中,什么是Bash脚本,并且如何使用它。
    Bash脚本是使用BashShell(BourneAgainSHell)语言编写的脚本文件,用于在Linux和类Unix系统上自动化执行一系列命令。Bash是Unix/Linux系统中最常用的Shell之一,它不仅支持基本的命令执行,还提供了丰富的编程结构,如变量、控制结构(如if条件判断、for和while循环)、函数、字符串操作、文......
  • DNS
    /etc/resolv.confhotes解析DNS(域名)解决问题:易于记忆:人们更容易记住“example.com”这样的名称,而不是“192.0.2.1”这样的IP地址。稳定性:即使网站的IP地址变更,域名仍然保持不变,用户不需要知道背后的IP地址变化。组织性:域名提供了一种组织互联网资源的方式,例如不同的顶级域......
  • DNSlog注入原理
    DNSlog注入的原理主要涉及将盲注转换为显错注入,通过利用域名系统(DNS)的解析过程来获取信息。以下是DNSlog注入原理的详细解释:DNS解析过程:当用户在浏览器中输入一个域名时,本地域名服务器(LocalDNS)会首先查询自身缓存中是否存在该域名的IP地址记录。如果没有,它会向根域名服务器(Roo......
  • bash文件书写学习记录
    参考资料:基于Bash脚本自己开发ROS的一键启动-古月居(guyuehome.com)#!/bin/bash和#!/usr/bin/envbash的区别-CSDN博客几种常见shell解释器(sh,bash,csh,tcsh,ash)以及bash的优点_bash与ash-CSDN博客 第一个链接对于bash文件的书写写的挺好的通俗易懂;  launch文件......
  • 使用Git bash切换Gitee、GitHub多个Git账号
    使用Gitbash切换Gitee、GitHub多个Git账号​ Git是分布式代码管理工具,使用命令行的方式提交commit、revert回滚代码。这里介绍使用Gitbash软件来切换Gitee、GitHub账号。​ 假设在gitee.com上的邮箱是[email protected]、用户名为alice;在github上的邮箱是[email protected]、......