Перейти к содержимому
hostsctl — управление /etc/hosts из YAML-конфига: группы, файлы-зоны, удалённые блоклисты, бэкапы

hostsctl

Один YAML-конфиг. Всё остальное в /etc/hosts остаётся ровно там, где вы это оставили.
  1. Поставить и создать конфиг:

    Terminal window
    brew install jtprogru/tap/hostsctl
    hostsctl init
  2. Добавить запись — она попадает в конфиг, а не сразу в /etc/hosts:

    Terminal window
    hostsctl add 127.0.0.1 k8s.orb.local --comment orbstack
  3. Посмотреть перед записью. diff не требует root и ничего не меняет:

    Terminal window
    hostsctl diff
  4. Применить:

    Terminal window
    sudo hostsctl apply

Результат в /etc/hosts:

127.0.0.1 localhost ← системные строки, не тронуты
255.255.255.255 broadcasthost
# >>> hostsctl begin >>>
# generated by hostsctl 2026-08-11 17:15
# source: /Users/you/.config/hostsctl/config.yaml — edit that, not this block
# --- local — Local development ---
127.0.0.1 k8s.orb.local # orbstack
# <<< hostsctl end <<<

Файл остаётся вашим

Записи рендерятся в блок между маркерами. Системные строки, блоки других утилит и ручные правки переносятся байт в байт — это проверено тестами на копии настоящего /etc/hosts.

Группы, которые выключаются

Группа включается и выключается целиком. Выключил блоклист на день, включил обратно — и ничего в конфиге за это время не потерялось.

Конфиг по файлам

Можно держать всё в одном config.yaml, а можно разложить по зонам — в обычном hosts-синтаксисе или в YAML. Правки через CLI уходят обратно в тот файл, откуда группа пришла.

Честность про отказы

Атомарная запись с fsync и rename, снимок перед каждой записью, отказ отдать файл без 127.0.0.1 localhost и отдельный код выхода на каждый способ упасть.

Впервые здесь? Прочитайте две страницы из раздела Начало, а потом возвращайтесь за тем руководством, которое отвечает на вашу задачу.

Руководства — по одной задаче на страницу

Заголовок раздела «Руководства — по одной задаче на страницу»

hostsctl не резолвит имена — это делает /etc/hosts со всеми своими ограничениями. Wildcards, порты и пути в имени хоста там не работают, поэтому hostsctl check отвергает их, а не даёт системе молча проигнорировать. Для wildcard-доменов нужен dnsmasq или /etc/resolver/.