![Mac OS X“hosts”文件,我可以将其他文件包含在其中吗?](https://linux22.com/image/1302400/Mac%20OS%20X%E2%80%9Chosts%E2%80%9D%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%91%E5%8F%AF%E4%BB%A5%E5%B0%86%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E5%9C%A8%E5%85%B6%E4%B8%AD%E5%90%97%EF%BC%9F.png)
我正在编写一些自动化脚本来配置我的网络设置、主机文件内容和 /etc/resolver 文件,以便访问我经常访问的不同网络。
有一些组合可能会发生,所有这些组合都需要更改主机文件,并且我想避免必须设置不同组合的矩阵,从而在各处重复共享设置。
例如,我可能在我可以使用工作网络(即在大楼内)或通过 VPN 访问。在这两种情况下,我都需要向 hosts 文件添加一些设置以使网络正常工作,有些设置是共享的,有些则不是。此外,如果我使用 VPN,我可能在家,在这种情况下,hosts 文件中还有一些其他设置我还想添加。
因此,我希望,除了为“家庭,通过 VPN 访问工作”与“家庭,不访问工作”等创建一个文件外,有没有办法让我包含其他文件?
例如,假设以下假设语法有效:
#!include home.hosts
#!include work.hosts
127.0.0.1 localhost
::1 localhost
这样,我可以简单地清除这两个额外文件中的一个或两个的内容,而保留其余部分。
或者,除此之外,有没有更好的方法来做到这一点,而不是仅仅构建一个小脚本,将这些文件连接成一个新的主机文件,作为我的自动化设置的一部分,我首先清除一些额外的文件,然后我调用脚本从这些额外的文件中重建单个主机文件?
答案1
我不知道有任何包含的可能性。不过,我会在 hosts 文件中创建部分,然后使用脚本(例如 sed)注释每个部分中的行。
这样你的文件看起来就会像这样
#%%%HOME.HOSTS%%%
#Put here the contents of home.hosts
#%%%WORK.HOSTS%%%
#Put here the contents of work.hosts
#%%%ALWAYS_ON%%%
127.0.0.1 localhost
::1 localhost
编辑:快速添加修改字段的尝试。
删除 HOME.HOSTS 的注释
sed -i '/#%%%HOME.HOSTS/,/#%%%/s/^#\([^%]\)/\1/g' hosts
恢复 HOME.HOSTS 的评论
sed -i '/#%%%HOME.HOSTS/,/#%%%/s/^\([^#]\)/#\1/g' hosts
这是一个基础版本,需要根据您的需要进行调整。
答案2
由于切换到 OpenDirectoryService 后 dscl 不再起作用,因此一个选项是使用 ghost:
sudo gem install ghost
sudo ghost add fw.test.se 10.0.0.1
...将在 /etc/hosts 中添加此部分:
# ghost start
10.0.0.1 fw.start.se
# ghost end
要清除主机文件的 #ghost 部分,请使用(这可以轻松地用新的主机列表替换主机列表):
sudo ghost empty
您可以在这里找到有关鬼魂的更多信息: https://github.com/bjeanes/ghost
答案3
当我需要使用 hosts 文件中不同的 LAN / WAN 设置访问三个不同位置的服务时,我也遇到过类似的用例。Karolos 的上述回答是一种可能的解决方案。我的方法如下。
1- 参考http://apple.stackexchange.com/q/139267/74657
2- 为每个位置创建主机文件 (hosts.work、hosts.home、hosts.vendor)
3- 使用 soloz 的脚本,这里(https://github.com/slozo/Network-listener)每当我连接到家庭网络时,我都会执行简单的脚本来切换主机文件。
最简单的方法是
mv hosts.home /etc/hosts
或者,您可以使用 sed 自动执行上述 Karolos 的回答,以在连接到特定 SSID 时更新现有文件,您可以使用上面提到的 soloz 脚本轻松检测和运行该文件。
希望这能帮助任何遇到该问题的人。