Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am working on some automation scripts to configure my network settings, hosts file contents, and /etc/resolver files, when accessing different networks I frequent between.

There are some combinations that can occur that all require changes to the hosts file, and I'd like to avoid having to set up a matrix of different combinations, duplicating the shared settings all over the place.

For instance, I may be on the work network, ie. in the building, or I may access it over VPN. In both cases, I need to add some settings to the hosts file for networking to work properly, some are shared, some are not. Additionally, if I'm over VPN, I may be at home, in which case there are some other settings in the hosts file I also want to add.

As such, I was hoping that instead of creating one file for "home, accessing work over VPN" vs. "home, not accessing work", etc., is there a way for me to include other files?

For instance, let's say the following hypothetical syntax works:

#!include home.hosts
#!include work.hosts localhost
::1 localhost

This way, I could simply clear out the contents of one, or both, of those two extra files, and leave the rest be.

Or, barring that, is there a better way to do this than to just build a small script that concatenates files such as those into a new hosts file, and as part of my automation setup, I first clear out some of those extra files, and then I invoke the script to rebuild the single hosts file from those extra files?

share|improve this question
Are you sure you require changes to the hosts file as opposed to e.g. modifying the host entries via dscl directly? – Daniel Beck Jan 22 '12 at 16:39
I was not aware of the dscl command, I will have to research on that as well. – Lasse V. Karlsen Jan 22 '12 at 18:36
See e.g. here. Internally, OS X uses its directory services, which you can control using dscl, for which /etc/hosts is simply one of the available data sources, providing (of course) hostname/IP address mappings. Setting up a script that writes to dscl and flushes the cache might work better in your situation than keeping multiple copies of the hosts file, or rewriting it all the time. – Daniel Beck Jan 22 '12 at 18:39
@DanielBeck: Good point! I wasn't aware of all the capabilities of dscl. – Karolos Jan 22 '12 at 19:33
Let me know how it works, if you want to try doing it that way. Haven't tried it myself, so I don't post it as an answer. Good luck! – Daniel Beck Jan 22 '12 at 19:35
up vote 7 down vote accepted

I am not aware of any include possibility. What I'd do, however, is to make sections in my hosts file, and then use a script to comment the lines in each section using, e.g., sed.

This way your file would look like

#Put here the contents of home.hosts
#Put here the contents of work.hosts

#%%%ALWAYS_ON%%% localhost
::1 localhost

Edit: Adding in a quick attempt to modify the fields.

Removing the comment for HOME.HOSTS

 sed -i '/#%%%HOME.HOSTS/,/#%%%/s/^#\([^%]\)/\1/g' hosts

Putting back the comments for HOME.HOSTS

 sed -i '/#%%%HOME.HOSTS/,/#%%%/s/^\([^#]\)/#\1/g' hosts

This is a basic version, and needs to be adjusted to your needs.

share|improve this answer
Hello Karolos, could you describe more about the command: sed -i '/#%%%HOME.HOSTS/,/#%%%/s/^#\([^%]\)/\1/g' hosts and about the section in hosts file please. I'm really not understand why :( – Toan Nguyen Jan 16 '15 at 2:14
@NNToan: Whan the line does is tell sed to add or remove a # at the beginning of the lines between two #%%% lines. This will comment or un-comment the lines. The example shows how to comment the HOME.HOSTS section using #%%%HOME.HOSTS ; you should use #%%%WORK.HOSTS instead in the sed command to comment or un-comment the WORK.HOSTS section. – Karolos Jan 18 '15 at 16:24

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .