2010-09-20 40 views
0

我創建了一個bash腳本來在我的主DNS服務器和次DNS服務器之間傳輸我的區域。 它從主服務器下載我的區域列表並檢查任何新區域,然後下載並將這些區域文件插入到區域目錄和.local文件中以進行綁定。Bind9 DNS區域傳輸腳本 - 避免重複的Bash腳本

我遇到的問題是,如果區域文件不存在,則無論此配置是否已存在,腳本都會將詳細信息輸入到.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

你的問題被標記爲'[bash]'但你的shebang說'#!/ bin/sh'。這是什麼? – 2010-09-20 15:33:40

回答

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 ]的問題。

sedawk能做到這一切在同一行:

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) 

SH:

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 

它總是一個好習慣引用包含文件名的變量。

+0

這是非常具有說服力的,我將不得不通過它來檢驗你所描述的方法,並看看它是如何發展的。我對linux腳本編程非常陌生,從來沒有真正學到過什麼,而不是我必須做的和那些工作。 – kaotix 2010-09-21 11:40:04

0

如果你想要同步所有的問題named.conf你可能也是rsync整個配置包括區域文件,而不是打擾使用主和次之間的區域傳輸。

將AXFR用於從屬服務器絕不是強制性的。如果您對某個區域的所有服務器擁有管理控制權,那麼將它們全部視爲主控者是完全可以接受的。

+0

這是一個非常好的主意,我甚至沒有考慮過。我將研究獲取此方法設置。我唯一的區別是兩個服務器上bind區域文件的位置不一樣,所以我需要使用某種形式的腳本來更改它? – kaotix 2010-09-21 11:37:46

+0

你可以在一個符號鏈接中創建一個名爲named.conf的(缺失)目錄指向真實目錄。 – Alnitak 2010-09-21 15:57:51