Linux

如何使用 nsupdate 更新記錄?

  • February 11, 2022

我們知道我們可以通過執行以下步驟來更新記錄(其 IP):

nsupdate
server ns.bar44.com
zone bar44.com
update delete somehost.bar44.com. A
update add somehost.bar44.com. 86400 A 10.10.10.1
show
send
  1. 正如我們所見,我們知道 somehost.bar44.com。存在於數據庫中,如果我想更新現有記錄的 IP,這將起作用,但如果我想更改主機名而不是 IP 怎麼辦。例如,我想讓 10.10.10.1 成為 somehost22.bar44.com 的 IP。什麼會讓我知道 IP 已被 somehost.bar44.com 佔用?
  2. 這是一種使用 nsupdate 刪除某個區域的整個數據庫的方法嗎?

免責聲明:使用此腳本需要您自擔風險


它能做什麼?

正如 O/P 想要的那樣,假設他想要添加somedomain.bar44.com並且somedomain44.bar44.com已經存在於區域中,那麼它應該首先刪除somedomain44.bar44.com然後重新添加somedomain.bar44.com到區域中。下面的腳本就是這樣做的。使用 BIND9 在 Ubuntu 上測試。

簡而言之,xyz.bar.com如果它還不存在,它將添加,如果它存在,它將首先刪除(xyz*.bar.com),然後使用您提供的新資訊重新添加。

腳本:

#!/bin/bash
#
## Update DNS Records Interactive
## Rahul Patil <http://www.linuxian.com>

#
## Functions
#

ask() {
   
   while [[ $ans == "" ]]
   do
       read -p "${@}"  ans
   done

   echo $ans
}

forward_zone_update() { 
   local rr=${@}
   echo "
   server $DNS_SERVER
   zone $DNS_ZONE
   update add $rr
   show
   send" | nsupdate
}

delete_record() { 
   local rr=${@}
   echo "
   server $DNS_SERVER
   zone $DNS_ZONE
   update delete $rr
   show
   send" | nsupdate
}


#
## Global Variable
#
DNS_IP="127.0.0.1"
DNS_SERVER="ns1.rahul.local"
DNS_ZONE="rahul.local"
DIG_CMD='dig +noquestion +nocmd +nostat +nocomments'

update_rr_a=$( ask "Enter FQDN of Record (Ex. xyz.${DNS_ZONE}) :-")
update_rr=$( ask "Enter IP of Record :-")
found_rr=$($DIG_CMD @${DNS_IP} AXFR ${DNS_ZONE} | grep  ^"${update_rr_a%.$DNS_ZONE}" | tee /tmp/rr.tmp )

echo "Checking ${update_rr_a}..."

if [[ -z "${found_rr}" ]] 
then
   echo "${update_rr_a} does exists"
   echo "${update_rr_a} adding to ${DNS_ZONE}"
   forward_zone_update "${update_rr_a} 86400 IN A ${update_rr}"
   echo "Done!!"
else
   echo "${update_rr_a} already exists"
   ans=$(ask "Do you want to Delete RR and want to re-add(y/n?)")
   case $ans in
       [yY]|[yY][eE][sS]) while read r; 
                  do delete_record $r ; 
                              done &lt; /tmp/rr.tmp ;;

       [nN]|[nN][oO])     exit 1 ;;
   esac
   forward_zone_update "${update_rr_a} 86400 IN A ${update_rr}"
   echo "Done!!"
fi

引用自:https://unix.stackexchange.com/questions/131883