0

我创建了一个 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
4

2 回答 2

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)

嘘:

grep -vf ignore.txt $TMPZONEFILE > tmp.out
while ...
do
    ...
done < tmp.out

顺便说一句,我建议使用mktemptempfile创建临时文件。

这可能更具可读性,并允许您包含引号而不必转义它们:

cat << EOF >> "$NAMED"
zone "$ZONE" {
  type slave;
  file "$ZONELOCATION/$ZONE.db";
  masters { 91.121.75.205; };
  allow-notify { 91.121.75.205; };
  };
EOF

引用包含文件名的变量总是一个好习惯。

于 2010-09-20T16:07:54.197 回答
0

如果您要费尽心思进行同步,您不妨 rsync包括区域文件在内的named.conf整个配置,而不必费心在主要和次要之间使用区域传输。

将 AXFR 用于从属服务器绝不是强制性的。如果您对某个区域的所有服务器具有管理控制权,那么将它们都视为主服务器是完全可以接受的。

于 2010-09-21T07:24:38.383 回答