Osx

是什麼導致 MacOS Sierra 上 /etc/resolver/ 中的變化引起注意

  • March 25, 2020

我想為一個特定的域使用非預設 DNS 解析器,第一個想法是簡單地使用本地 dnsmasq。在尋找 MacOS 版本時,我發現只需在/etc/resolver/example.com.

nameserver 8.8.8.8

一切都很好,按預期工作,解決方案有效,並scutil --dns確認:

resolver #8
 domain   : example.com
 nameserver[0] : 8.8.8.8
 flags    : Request A records
 reach    : Reachable

接下來,我想與一位朋友分享這一點,方法是創建一個可以在終端中執行的簡單班輪:

sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.9" | sudo tee /etc/resolver/example.net

再次scutil --dns確認:

resolver #10
 domain   : example.net
 nameserver[0] : 8.8.8.9
 flags    : Request A records
 reach    : Reachable

然後我注意到一個錯字,所以我將地址更正為 8.8.8.8 並再次執行該行:

sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.8" | sudo tee /etc/resolver/example.net

但這似乎沒有任何效果:

resolver #10
 domain   : example.net
 nameserver[0] : 8.8.8.9
 flags    : Request A records
 reach    : Reachable

我檢查了文件內容,一切似乎都很好:

$ cat /etc/resolver/example.net 
nameserver 8.8.8.8

然後我在 中打開文件vim,更改為8.8.4.4

resolver #10
 domain   : example.net
 nameserver[0] : 8.8.4.4
 flags    : Request A records
 reach    : Reachable

我來回檢查了幾次,當我將地址回顯到文件時,更改沒有效果,但只打開它就足夠了,vim甚至沒有更改任何東西(只是退出),之前回顯的更改將被應用。這背後的機制是什麼?

$$ It $$僅打開它就足夠了,vim甚至不更改任何內容(只是退出),將應用先前回顯的更改。

我不得不使用sudo vim它來工作。與我的普通使用者一起執行它沒有任何效果。我的理論是,任何正在監視的東西都會監視/etc/resolver目錄的更改,而不是監視目錄中的文件的更改,並且當它看到目錄發生更改時會重新載入其中的所有內容。Vim 創建一個交換文件,預設情況下與正在編輯的文件在同一目錄中。這是對目錄的更改,並由觀察者拾取。所以,當我這樣做時:

sudo vim -n /etc/resolver/example.net

-n禁用交換文件創建的情況下,不再拾取對文件的更改。

引用自:https://unix.stackexchange.com/questions/400395