2011-08-10 17 views
2

更改DNS服務器我想更改我的Linux計算機的DNS服務器。所以,我要編輯/etc/resolv.conf文件。通過編輯/etc/resolv.conf文件(使用sed)和問題

我正在使用的命令是SED。和做如下變更DNS服務器192.168.1.5
#cat /etc/resolv.conf | sed '/nameserver/ c\ nameserver 192.168.1.5' > /etc/resolv.conf

的問題是:

當我執行命令的第一時間,它改變的resolv.conf喜歡的東西:

domain somedomain
namserver 192.168.1.5

,但是當我再次執行它的DNS服務器更改爲192.168.1.4:
#cat /etc/resolv.conf | sed '/nameserver/ c\ nameserver 192.168.1.4' > /etc/resolv.conf

文件的resolv.conf變空

問題:
1.我邊做邊改DNS服務器的正確方法?
2.在上述命令中,sed命令是否存在問題?

回答

1

>重定向運作的方式,輸出文件被截斷任何命令的運行之前,這意味着cat應該看到一個空文件,因此預期結果什麼都沒有。我對你爲什麼第一次調用起作用感到有點困惑。您應該使用臨時文件(例如mv resolv.conf resolv.conf~並運行sed -e '...' resolv.conf~ > resolv.conf,不需要cat)。另外,如果你有GNU sed,你可以使用就地編輯選項(sed -i),同樣不需要cat

+0

謝謝@ jw013,我嘗試了很多次,第一次總是工作。我對「sed和cat」命令有了更清楚的瞭解。我將使用臨時文件 – sees

0

使用這個代碼(未測試的):

sed 's/nameserver.*/nameserver 192.168.1.5/' /etc/resolf.conf > /etc/resolf.conf.new 
mv /etc/resolf.conf.new /etc/resolf.conf 
+0

這麼快速的回答。非常感謝。我會測試它並報告 – sees

+0

我測試了你的命令,並且不幸在/ etc中不能使用mv命令。無論如何感謝您的建議。我知道了:) – sees

0

我會想象做下面的事情。使用sed將cat流操作爲不同的文件,然後以某種方式驗證這個新文件,例如統計行數,如果新文件有效,則用/etc/resolv.conf替換新文件。

可能是這樣的:

cat /etc/resolv.conf | sed "s/.*nameserver.*/nameserver 192.168.1.5/" > /etc/resolv.conf.sed; 

if [ "$(wc -l /etc/resolv.conf.sed)" -eq "0" ]; then 
    rm /etc/resolv.conf.sed; 
fi; 

if [ -e /etc/resolv.conf.sed ]; then 
    mv /etc/resolv.conf.sed /etc/resolv.conf 
fi; 

只有最後一行,以及嘗試計數線第一,使用打印頭打印所有行,但一到輸出文件,並使用尾打印的最後一行,執行sed的操縱和追加到輸出文件中,像這樣:

I=$(wc -l /etc/resolv.conf | cut -d\/ -f1); 
N=$[I-1]; 
head -n$N /etc/resolv.conf > /etc/resolv.conf.sed 
tail -n1 /etc/resolv.conf | sed "s/.*nameserver.*/nameserver 192.168.1.5/" >> /etc/resolv.conf.sed; 

if [ "$(wc -l /etc/resolv.conf.sed)" -eq "$I" ]; then 
    rm /etc/resolv.conf.sed; 
fi; 

if [ -e /etc/resolv.conf.sed ]; then 
    mv /etc/resolv.conf.sed /etc/resolv.conf 
fi; 
+0

感謝您提醒我驗證部分。將測試它是否有效 – sees

+0

你能告訴我只用sed命令改變最後一行的方法(如果resolv.conf中有兩行'nameserver')。有任何語法可以做到這一點? – sees

+0

我測試過但不能使用命令:** mv **,因爲/ etc是'只讀文件系統'。因此,我會將文件resolv.conf.sed寫入/ tmp之類的地方,並使用** cat **更改/etc/resolv.conf(無法刪除此文件但可以更改其內容) – sees

0

桑達具有在文件版;這是我如何做到這一點(如果我確信在該文件中只定義了一個名稱服務器,否則我會做其他事情,但我猜他們沒有這個問題)。在這個例子中,爲了安全起見,sed生成一個resolv.conf_bak文件。

~# NAMESERVER=192.168.1.5; 
~# sed -i_bak "s/\(nameserver\) .*/\1 $NAMESERVER/" /etc/resolv.conf 

這是一個更復雜的命令:

  1. 檢查是否存在有一行
  2. 如果是使用sed
  3. 編輯它,如果不創建一個新的

這是代碼:

~# grep -q nameserver /etc/resolv.conf && sed -i_bak "s/\(nameserver\) .*/\1 $NAMESERVER/" /etc/resolv.conf || echo "nameserver $NAMESERVER" >> /etc/resolv.conf 

再次提供您僅使用單個 nameserver條目工作!