Mac OS X“主机”文件,我可以在其中包含其他文件吗?


10

当我访问经常访问的不同网络时,我正在使用一些自动化脚本来配置我的网络设置,主机文件内容和/ etc / resolver文件。

可能会发生一些组合,这些组合都需要更改hosts文件,并且我想避免设置不同组合的矩阵,从而在各处复制共享设置。

例如,我可能工作网络上,即 在建筑物中,或者我可以通过VPN访问它。在这两种情况下,我都需要向主机文件添加一些设置以使网络正常工作,某些设置是共享的,有些则没有。此外,如果我是通过VPN,我可能是在家里,在这种情况下,有在主机其他一些设置文件我想补充。

因此,我希望不要为“家庭,通过VPN访问工作”和“家庭,不访问工作”等创建一个文件,而是可以让我包含其他文件?

例如,假设以下假设语法有效:

#!include home.hosts
#!include work.hosts

127.0.0.1 localhost
::1 localhost

这样,我可以简单地清除这两个额外文件中一个或两个的内容,而保留其余内容。

或者,除此以外,还有一种更好的方法,不仅仅是构建一个将诸如此类文件的文件串联到一个新的主机文件中的小脚本,并且作为我的自动化设置的一部分,我首先清除了其中一些额外的文件,然后我调用脚本从那些额外的文件中重建单个主机文件?


您确定要更改主机文件,而不是dscl直接更改主机条目吗?
丹尼尔·贝克

我不知道该dscl命令,因此也必须对此进行研究。
Lasse V. Karlsen 2012年

参见例如这里。OS X在内部使用其目录服务,您可以使用dscl进行控制,该目录服务/etc/hosts只是可用数据源之一,提供(当然)主机名/ IP地址映射。dscl在您的情况下,设置一个写入并刷新缓存的脚本可能比保留主机文件的多个副本或一直重写它更好。
丹尼尔·贝克

@DanielBeck:好点!我并不了解dscl的所有功能。
Karolos 2012年

如果您想尝试这种方式,请告诉我它是如何工作的。我自己还没有尝试过,所以我不会将其发布为答案。祝好运!
丹尼尔·贝克

Answers:


7

我不知道有任何包含可能性。但是,我要做的是在我的主机文件中创建节,然后使用脚本使用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

这是基本版本,需要根据您的需要进行调整。


您好Karolos,您能否详细描述该命令:sed -i '/#%%%HOME.HOSTS/,/#%%%/s/^#\([^%]\)/\1/g' hosts以及有关hosts文件中的部分。我真的不明白为什么:(
Toan Nguyen 2015年

@NNToan:比这行要告诉sed您在两个#%%%行之间的行的开头添加或删除#。这将注释或取消注释行。该示例说明如何使用#%%% HOME.HOSTS注释HOME.HOSTS部分;您应该在sed命令中使用#%%% WORK.HOSTS来注释或取消注释WORK.HOSTS部分。
Karolos 2015年

0

由于dscl由于切换到OpenDirectoryService而不再起作用,因此一种选择是使用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


0

当我需要使用主机文件中的不同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的脚本轻松检测并运行该SSID。

希望可以帮助任何在主题问题上绊脚石的人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.