我创建了一个bash脚本来在我的主DNS服务器和辅助DNS服务器之间传输我的区域。 它从主服务器下载我的区域列表并检查任何新区域,然后下载并将这些区域文件插入区域目录并插入.local文件以进行绑定。
我遇到的问题是,如果区域文件不存在,则无论此配置是否已存在,脚本都会将详细信息输入.local。
有人可以帮助我区分已经存在的区域,只需下载区域文件即可。 我已经在下面粘贴了我的脚本,如果有人对它的工作方式有任何疑问,请随时询问。 (有人可以包装代码,它在我尝试的任何浏览器中都无法正常使用!)
#!/bin/sh
NAMED="/etc/bind/named.conf.local"
TMPNAMED="/tmp/zns-441245.temp"
TMPZONEFILE="/tmp/zones.txt"
TMP="/tmp/zns-732.temp"
ZONELOCATION="/var/cache/bind"
IGNORE=`cat ignore.txt`
logger DNS Update script running...
echo -n "Checking for new named.conf... "
wget -q http://91.121.75.205:10801/named/named.conf -O $TMPNAMED
if [ -e $TMPNAMED ]
then
echo "done."
else
echo "no new data!"
exit
fi
echo -n "Generating zone names... "
grep "^zone" $TMPNAMED | cut -d " " -f "2" | cut -d "\"" -f 2 > $TMPZONEFILE
sed '1,5d' $TMPZONEFILE > $TMP
mv $TMP $TMPZONEFILE
echo "done. ("$TMPZONEFILE")"
echo "Generating zone info... "
grep -vf ignore.txt $TMPZONEFILE | while read ZONE; do
echo -n "Checking for $ZONELOCATION/$ZONE.db "
if [ -e $ZONELOCATION/$ZONE.db ]
then
echo "[ exists ]"
else
export updates="yes"
echo "[ doesn't exist ]"
echo "New zone available ($ZONE)... "
echo "zone \"$ZONE\" {
type slave;
file \"$ZONELOCATION/$ZONE.db\";
masters { 91.121.75.205; };
allow-notify { 91.121.75.205; };
};" >> $NAMED
fi
done
echo "Updating Bind configuration... "
/etc/init.d/bind9 restart
rm $TMPZONEFILE
rm $TMPNAMED
答案 0 :(得分:0)
一个问题可能是你的wget
创建了一个文件,无论是否有源文件,因此检查是否存在总是如此。
if [ -s $TMPNAMED ]
then
echo "done." # file exists AND has data
else
echo "no new data!"
exit
fi
将测试它是否为空或不存在,如果是,则退出。这也可能是您if [ -e $ZONELOCATION/$ZONE.db ]
的问题。
sed
或awk
可以在一行中完成所有这些操作:
grep "^zone" $TMPNAMED | cut -d " " -f "2" | cut -d "\"" -f 2 > $TMPZONEFILE
sed '1,5d' $TMPZONEFILE > $TMP
但我需要查看一些示例数据来提供解决方案。
简化引用:
echo "done. ($TMPZONEFILE)"
您没有使用IGNORE
变量或updates
变量。我认为没有任何理由将其导出。此外,如果您在其他地方依赖它,则在while
循环退出后它的值将无法生存,因为在grep
中将某些内容(while
)传递到while ...
do
...
done <(grep -vf ignore.txt $TMPZONEFILE)
会设置子shell。做其中一个可能更好:
击:
grep -vf ignore.txt $TMPZONEFILE > tmp.out
while ...
do
...
done < tmp.out
SH:
mktemp
顺便说一下,我建议使用tempfile
或cat << EOF >> "$NAMED"
zone "$ZONE" {
type slave;
file "$ZONELOCATION/$ZONE.db";
masters { 91.121.75.205; };
allow-notify { 91.121.75.205; };
};
EOF
来创建临时文件。
这可能更具可读性,允许您在不必转义它们的情况下包含引号:
{{1}}
引用包含文件名的变量始终是一个好习惯。
答案 1 :(得分:0)
如果您遇到同步named.conf
的所有麻烦,您可能同样可以同步整个配置,包括区域文件,而不必在主要和次要的。
将AXFR用于从属服务器并不是强制性的。如果您对某个区域的所有服务器都拥有管理控制权,那么将它们全部视为主服务器是完全可以接受的。