我使用运行cPanel / WHM的1台服务器和运行cPanel DNS Only的4台服务器(ns1-ns4)运行我自己的DNS群集。
我刚刚添加了第四个DNS Only服务器(ns4.domain.com),但问题是我当前的所有区域文件都不包含新添加的名称服务器。
所以,即使我所有的4个域名服务器上都有适当的区域文件来为我的域名服务dns查询,但是每个域名文件只列出了3个我的域名服务器,如下所示:
example.com. 86400 IN SOA ns1.domain.com. domains.domain.com. ( 2013081402 ;Serial Number 86400 ;refresh 7200 ;retry 2419200 ;expire 86400 ;minimum ) example.com. 86400 IN NS ns1.domain.com. example.com. 86400 IN NS ns2.domain.com. example.com. 86400 IN NS ns3.domain.com. example.com. 3600 IN A 11.22.33.44 localhost 3600 IN A 127.0.0.1 example.com. 14400 IN MX 0 example.com. mail 14400 IN CNAME example.com. www 14400 IN CNAME example.com. ftp 14400 IN CNAME example.com.
我希望能够批量编辑/添加我的新名称服务器(ns4.domain.com)到/var/named/*.db中的所有区域文件,所以所有的区域文件应该有NSlogging如下
example.com. 86400 IN NS ns1.domain.com. example.com. 86400 IN NS ns2.domain.com. example.com. 86400 IN NS ns3.domain.com. example.com. 86400 IN NS ns4.domain.com.
我唯一不知道如何将这行文本添加到所有的区域文件。 我知道如何replace,并且正在考虑沿着下面的方向做一些事情,但是我不认为这会因为没有新的线路而起作用。
replace "example.com. 86400 IN NS ns3.domain.com." "example.com. 86400 IN NS ns3.domain.com. example.com. 86400 IN NS ns4.domain.com." -- /var/named/*.db
区域文件中资源logging的顺序大多是任意的,只需在最后添加新logging即可。
不要忘了更新序列号!
这将操作区域文件,以便它将添加正确的序列号并追加正确的名称服务器。
您需要为每个区域文件调用脚本。 您可以使用find或一个glob的shell循环来做到这一点。
这依赖于序列号的格式,使得它包含“;序列号”。 它也期望域名被宣布为第一行的第一个字。 最后,它期望在“$ LASTNS”中声明的名称服务器在那里。 您可以在运行脚本之前更改该值。
哦,对脚本已经操作的区域文件运行这个脚本会破坏区域文件。 有一个简单的testing来解决这个问题,但会让你去解决这个问题。
#!/bin/bash set -e LASTNS="ns3.domain.com." NEWNS="ns4.domain.com." WORKDIR=$(mktemp -d /tmp/addns.XXXXXXXX) function cleanup { if [ -n "${WORKDIR}" -a -d "${WORKDIR}" ]; then rm -fr "${WORKDIR}" fi } function new_serial_no { local old=$1 local olddate="${old:0:8}" local newdate=$(date "+%Y%m%d") ## Figure out if the revision number needs to be bumped or if we override ## with a new date. if [[ $olddate == $newdate ]]; then newdate="${newdate}"$(printf "%02d" "$((${old:8:2}+1))") echo $newdate else echo ${newdate}00 fi } trap cleanup EXIT ZONEFILE=$1 if [ -z "${ZONEFILE}" -o ! -f "${ZONEFILE}" ]; then echo "Requires a zonefile as input" >&2 exit 1 fi DOMAIN=$(head -n1 "${ZONEFILE}" | cut -d " " -f1) SERIAL=$(grep ";Serial Number" "${ZONEFILE}" | egrep -o "[0-9]+") NEWSERIAL="" if [ -z "${DOMAIN}" -o -z "${SERIAL}" ]; then echo "Could not find matching domain or serial number" >&2 exit 1 fi NEWSERIAL=$(new_serial_no "${SERIAL}") if [ -z "${NEWSERIAL}" ]; then echo "Could not determine new serial number" >&2 exit 1 fi ## Have enough now to manipulate the file cp -p "${ZONEFILE}" "${WORKDIR}/zone" sed -ie "/${LASTNS}/a${DOMAIN} 86400 IN NS ${NEWNS}" "${WORKDIR}/zone" sed -ie "s/${SERIAL}/${NEWSERIAL}/" "${WORKDIR}/zone" NEWZONE=$(mktemp -u "${ZONEFILE}.XXXXXXX") cp -p "${WORKDIR}/zone" "${NEWZONE}" mv "${NEWZONE}" "${ZONEFILE}"