0

プライマリ DNS サーバーとセカンダリ DNS サーバーの間でゾーンを転送するための bash スクリプトを作成しました。プライマリからゾーン リストをダウンロードし、新しいゾーンをチェックしてから、それらのゾーン ファイルをダウンロードして、ゾーン ディレクトリとバインド用の .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

同期に手間がかかる場合は、ゾーンファイルを含むnamed.conf構成全体を再同期するだけでよく、プライマリとセカンダリ間のゾーン転送を使用する必要はありません。

AXFR をスレーブ サーバーに使用することは、決して必須ではありません。ゾーンのすべてのサーバーを管理している場合は、それらすべてをマスターとして扱うことはまったく問題ありません。

于 2010-09-21T07:24:38.383 に答える
0

1 つの問題はwget、ソース ファイルがあるかどうかに関係なくファイルを作成するため、存在のチェックが常に true になることです。

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これらすべてを 1 行で行うこともできます。

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

ちなみに、一時ファイルを使用する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

ファイル名を含む変数を引用符で囲むことは常に良い習慣です。

于 2010-09-20T16:07:54.197 に答える