特定のドメインに対してデフォルトではないDNSリゾルバを使用したいのですが、最初のアイデアは単にローカルdnsmasqを使用することです。 MacOSのバージョンを探している間、次のような単純な1行でドメイン名を/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
次に、端末で実行できる簡単な1行コードを作成して、友達と共有したいと思いました。
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
(終了のみ)、以前にエコーされた変更が適用されます。これのメカニズムは何ですか?
答え1
[It]ただ開ければ十分です
vim
。何も変更せずに(ただ終了すると)、以前にエコーされた変更が適用されます。
sudo vim
仕事に使うべきです。通常のユーザーとして実行しても効果はありません。私の理論は、/etc/resolver
ディレクトリ内のファイルではなくディレクトリへの変更を監視し、ディレクトリへの変更を見つけたら、その中のすべてを再ロードすることです。 Vimは、デフォルトで編集中のファイルと同じディレクトリにあるスワップファイルを作成します。これはディレクトリへの変更であり、オブザーバによって検出されます。だから私がするとき:
sudo vim -n /etc/resolver/example.net
スワップファイルの作成が無効になると、-n
ファイルの変更は適用されなくなります。
答え2
既存のファイルの変更は、/etc/resolver
フォルダ内のファイルが作成または削除されたときにのみ認識されません。
このフォルダを監視するプラグインですIPMonitor
。ソースコードから:configd
status = notify_monitor_file(notify_token, resolver_directory_path, 0);
この機能の目的は、inode
パスにモニタを設定することです。したがって、そのディレクトリのファイルが変更されinode
たときにのみ通知を受け取ります/etc/resolver
。inode
UNIXでは、ディレクトリは、ディレクトリの内容を一覧表示するテーブルの内容を含むファイルと同じです。したがって、ファイルを追加または削除するたびにテーブルが更新され、それに応じて更新され、inode
通知がトリガーされます。ディレクトリ内のファイルを編集する場合、inode
そのディレクトリはまったく触れません。
しかし、/etc/resolver
macOSではまったく使用しないでください。以前のバージョンとの互換性のためにのみ維持されます。代わりに、ツールを使用してアクセスできる動的リポジトリにDNSエントリを作成する必要がありますscutil
。確認してくださいこのトピックに対する私の答え。
答え3
コンピュータを再起動するか、ネットワークデバイスのDNS設定を強制的に更新するまで、scutil --dns
予想されるDNSエントリを再インポートすることはできません。
networksetup -setdnsservers Wi-fi 8.8.8.8
この修正/ハッキングの詳細についてはこちらをご覧ください。https://josephharding.github.io/tutorials/2018/06/28/mac-resolver-refresh.html