Osx
是什麼導致 MacOS Sierra 上 /etc/resolver/ 中的變化引起注意
我想為一個特定的域使用非預設 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
禁用交換文件創建的情況下,不再拾取對文件的更改。