Файл Mac OS X «hosts», могу ли я включить в него другие файлы?

10

Я работаю над некоторыми сценариями автоматизации для настройки сетевых параметров, содержимого файлов хостов и файлов / etc / resolver при доступе к различным сетям, между которыми я часто бываю.

Могут возникнуть некоторые комбинации, которые требуют внесения изменений в файл hosts, и я бы хотел избежать создания матрицы различных комбинаций, повсеместно дублирующих общие настройки.

Например, я могу быть на рабочей сети, то есть. в здании, или я могу получить к нему доступ через VPN. В обоих случаях мне нужно добавить некоторые настройки в файл hosts для правильной работы сети, некоторые являются общими, некоторые нет. Кроме того, если я использую VPN, я могу быть дома, и в этом случае в файле хостов есть некоторые другие настройки, которые я также хочу добавить.

Поэтому я надеялся, что вместо того, чтобы создать один файл для «дома, доступа к работе через VPN» и «дома, не доступа к работе» и т. Д., Есть ли способ включить другие файлы?

Например, допустим, работает следующий гипотетический синтаксис:

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

127.0.0.1 localhost
::1 localhost

Таким образом, я мог бы просто очистить содержимое одного или обоих из этих двух дополнительных файлов, а остальные оставить.

Или, кроме этого, есть ли лучший способ сделать это, чем просто создать небольшой сценарий, который объединяет файлы, подобные этим, в новый файл hosts, и в качестве части моей настройки автоматизации я сначала очищаю некоторые из этих дополнительных файлов, и затем я вызываю сценарий для перестройки одного файла hosts из этих дополнительных файлов?

Лассе В. Карлсен
источник
Вы уверены, что вам нужны изменения в файле hosts, а не, например, изменение записей хоста dsclнапрямую?
Даниэль Бек
Я не знал о dsclкоманде, мне также придется исследовать это.
Лассе В. Карлсен
Смотрите, например, здесь . Внутри OS X использует свои службы каталогов, которыми вы можете управлять dscl, для которых /etc/hostsпросто является одним из доступных источников данных, предоставляя (конечно) сопоставления имени хоста / IP-адреса. Настройка сценария, который записывает dsclи очищает кэш, может работать лучше в вашей ситуации, чем хранить несколько копий файла hosts или перезаписывать его все время.
Даниэль Бек
@DanielBeck: Хороший вопрос! Я не знал обо всех возможностях dscl.
Каролос
Дайте мне знать, как это работает, если вы хотите попробовать сделать это таким образом. Сам не пробовал, поэтому не публикую в качестве ответа. Удачи!
Даниэль Бек

Ответы:

7

Я не знаю ни о какой возможности включения. Однако я хотел бы создать разделы в моем файле 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

Это базовая версия, и ее необходимо адаптировать к вашим потребностям.

Karolos
источник
Здравствуйте, Karolos, не могли бы вы подробнее рассказать о команде: sed -i '/#%%%HOME.HOSTS/,/#%%%/s/^#\([^%]\)/\1/g' hostsи о разделе в файле hosts, пожалуйста. Я действительно не понимаю, почему :(
Тоан Нгуен
@NNToan: Что делает строка, так это говорит sedдобавить или удалить символ # в начале строк между двумя # %%% строками. Это будет комментировать или снимать комментарии строк. В примере показано, как комментировать раздел HOME.HOSTS с помощью # %%% HOME.HOSTS; вы должны использовать # %%% WORK.HOSTS вместо этого в команде sed, чтобы комментировать или снимать комментарии в разделе WORK.HOSTS.
Каролос
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 в файле hosts (это позволяет легко заменить список хостов новым):

sudo ghost empty

Вы можете найти больше информации о призраке здесь: https://github.com/bjeanes/ghost

Campell
источник
0

У меня был похожий случай использования, когда мне нужно было получить доступ к службам в трех разных местах, используя разные настройки LAN / WAN в файле hosts. Ответ Каролоса выше - одно из возможных решений. Мой подход здесь.

1 - ссылка на http://apple.stackexchange.com/q/139267/74657

2 - созданные файлы хостов для каждого местоположения (hosts.work, hosts.home, hosts.vendor)

3. Используя скрипт soloz, здесь ( https://github.com/slozo/Network-listener ) всякий раз, когда я подключаюсь к домашней сети, я выполняю простой скрипт для переключения файла hosts.

Самый простой способ будет

mv hosts.home /etc/hosts

в качестве альтернативы вы можете автоматизировать ответ Karolos выше, используя sed, чтобы обновить выходной файл при подключении к определенному SSID, который вы можете легко обнаружить и запустить с помощью скрипта soloz, упомянутого выше.

Надеюсь, что это поможет кому-нибудь наткнуться на эту тему.

user728650
источник