Системные настройки и их управление из CLI (defaults)

Рейтинг: 45.3% · 9 голосов
Подробный курс по macOS для разработчиков и админов: архитектура и Apple Silicon, терминал и zsh, Homebrew и пакеты, launchd и автоматизация, APFS и Time Machine, безопасность (SIP, Gatekeeper, TCC, FileVault), сеть, логи и диагностика, MDM и DDM, контейнеры и виртуализация, восстановление. По официальной документации Apple, актуально на 2026 (macOS 26 Tahoe).
Ответить
Аватара пользователя
Artem_MacAdmin
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Системные настройки и их управление из CLI (defaults)

Сообщение Artem_MacAdmin »

Оглавление курса (47)
  1. Что такое macOS: Unix под капотом и место в 2026
  2. Архитектура macOS: XNU, тома и Signed System Volume
  3. Apple Silicon: ARM, Rosetta 2 и отличия от Intel
  4. Установка, обновление и восстановление macOS
  5. Finder, рабочий стол и продуктивность
  6. Системные настройки и их управление из CLI (defaults) (вы здесь)
  7. Пользователи и группы: учётные записи и управление
  8. Терминал и zsh: командная строка macOS
  9. CLI на macOS: BSD-команды и отличия от Linux
  10. Настройка zsh: .zshrc, prompt, плагины
  11. Файловая система и права: POSIX, ACL, атрибуты, флаги
  12. Homebrew: пакетный менеджер для macOS
  13. Homebrew глубже: tap, Brewfile, services, обслуживание
  14. Другие пакеты: MacPorts, mas, Nix и App Store
  15. Установка приложений: .app, .dmg, .pkg и Gatekeeper
  16. Управление приложениями и их данные
  17. launchd и launchctl: система запуска macOS
  18. Свои службы и периодические задачи на launchd
  19. Автоматизация: Shortcuts, AppleScript и osascript
  20. Конфигурация как код: defaults, plist и профили
  21. APFS: снапшоты, клоны, контейнеры и шифрование
  22. Управление дисками: diskutil, образы и форматирование
  23. Time Machine и резервное копирование
  24. Внешние диски, форматы и сетевые тома
  25. Модель безопасности macOS: SIP и целостность системы
  26. Gatekeeper, нотаризация и защита от вредоносов
  27. Приватность и TCC: разрешения на доступ
  28. FileVault: полнодисковое шифрование
  29. Связка ключей и управление секретами
  30. Сетевой экран и защита сети
  31. Сеть в macOS: настройка и инструменты
  32. Диагностика сети на Mac
  33. Общий доступ: SSH, экран, файлы, удалённое управление
  34. Процессы и ресурсы: мониторинг производительности
  35. Логи macOS: unified logging и диагностика
  36. Производительность и энергия: powermetrics, диагностика
  37. Энергия, сон и обслуживание системы
  38. Профили конфигурации и основы MDM
  39. Управление парком Mac: MDM, DDM и zero-touch (2026)
  40. Среда разработчика на Mac: Xcode CLT, git, версии
  41. Контейнеры на Mac: Docker Desktop, OrbStack, Apple container
  42. Виртуализация: Virtualization.framework, UTM, Linux и Windows
  43. Режимы загрузки и восстановление (Apple Silicon)
  44. Сброс, NVRAM, Safe Mode и сброс настроек
  45. Траблшутинг macOS: дерево решений по симптомам
  46. Место на диске и обслуживание системы
  47. Сквозной проект: настройка Mac как у профи + куда расти
Ты только что развернул десятый по счету Mac для команды. И вот ты снова кликаешь по одним и тем же галочкам в Системных настройках: показать расширения файлов, отключить автокоррекцию, поведение Dock, скорость повтора клавиш. На третьей машине это бесит, на десятой - хочется все сжечь. Хорошая новость: почти каждый переключатель в этом окне - это запись в обычном текстовом (точнее, бинарном) plist-файле. А значит, его можно прочитать, записать и раскатать скриптом. Этот урок про инструмент, который превращает клики в код: defaults.

Разберемся, как реально устроены системные настройки mac изнутри, где лежат файлы, почему defaults write иногда "не срабатывает", чем тут поможет cfprefsd, и как собрать скрипт автонастройки нового Mac. В конце - про парк машин и профили конфигурации как взрослую альтернативу скриптам.

Что такое System Settings и где лежат настройки

Начиная с macOS Ventura приложение называется Системные настройки (System Settings), а не System Preferences как было до этого. Apple переделала его в стиле iOS - боковая панель со списком разделов вместо сетки иконок. На macOS 26 Tahoe (2025, последняя версия с поддержкой Intel) это все тот же System Settings, просто еще немного причесанный. Для нас важно не как оно выглядит, а что под капотом ничего не поменялось: GUI - это просто красивая морда поверх системы пользовательских настроек (user defaults).

Физически настройки - это property list файлы, plist. Лежат они по нескольким уровням, и порядок тут не случайный:
  • ~/Library/Preferences/ - настройки твоего пользователя. Тут живет com.apple.dock.plist, com.apple.finder.plist и сотни других.
  • ~/Library/Preferences/ByHost/ - настройки пользователя, привязанные к конкретной машине (по Hardware UUID в имени файла). Сюда пишет флаг -currentHost.
  • /Library/Preferences/ - системные настройки, общие для всех пользователей. Запись сюда требует sudo.
  • /Library/Managed Preferences/ - сюда MDM кладет управляемые настройки из профилей конфигурации. Это приоритет над тем, что юзер наставил сам.
Plist в современной macOS обычно в бинарном формате - открывать его как текст бесполезно, увидишь кашу. Поэтому редактировать руками их не надо. Работаем через инструменты, которые понимают формат: defaults и plutil.

Изображение

defaults read: как заглянуть внутрь

Любой plist адресуется парой домен -> ключ. Домен - это, как правило, bundle identifier приложения в обратной нотации: com.apple.dock, com.apple.finder. Команда defaults read mac-настроек без аргументов вывалит вообще все домены пользователя (огромная простыня), поэтому почти всегда указывают домен:

Код: Выделить всё

$ defaults read com.apple.dock
{
    autohide = 0;
    "mineffect" = genie;
    "orientation" = bottom;
    "show-recents" = 1;
    tilesize = 48;
}
Это уже читаемо: autohide = 0 значит автоскрытие выключено, tilesize = 48 - размер иконок, orientation = bottom - Dock снизу. Хочешь один конкретный ключ - добавь его именем:

Код: Выделить всё

$ defaults read com.apple.dock tilesize
48
Полезный спутник - read-type, показывает тип значения. Это критично: если запишешь строку "1" туда, где ждут integer, настройка может просто игнорироваться.

Код: Выделить всё

$ defaults read-type com.apple.dock tilesize
Type is integer
Чтобы найти нужный домен, когда не помнишь точное имя:

Код: Выделить всё

$ defaults domains | tr ',' '\n' | grep -i finder
com.apple.finder
И универсальный поиск ключа по всем доменам - когда знаешь часть имени настройки, но не знаешь, где она:

Код: Выделить всё

$ defaults find AppleShowAllExtensions
Found 1 keys in domain 'Apple Global Domain': {
    AppleShowAllExtensions = 1;
}
Тут всплыл особый домен - Apple Global Domain (он же -globalDomain, он же -g, файл .GlobalPreferences.plist). Это глобальные настройки, не привязанные к одному приложению: язык, формат даты, поведение клавиатуры, показ расширений файлов. Их читают многие программы сразу.

defaults write: ключевой инструмент админа

Запись - это то, ради чего все затевалось. Синтаксис: defaults write домен ключ -тип значение. Тип указывать обязательно по-хорошему, иначе угадает defaults и может угадать неверно. Доступные типы: -string, -int (integer), -float, -bool (true/false/yes/no), -date, -array, -dict, -data.

Классика - показать все расширения файлов в Finder (глобальный ключ, булев):

Код: Выделить всё

$ defaults write NSGlobalDomain AppleShowAllExtensions -bool true
Размер иконок Dock в пикселях (integer):

Код: Выделить всё

$ defaults write com.apple.dock tilesize -int 36
Скорость повтора клавиш и задержку перед повтором - то, что в GUI задается грубыми ползунками, а через defaults можно загнать в значения, недоступные мышкой:

Код: Выделить всё

$ defaults write NSGlobalDomain KeyRepeat -int 2
$ defaults write NSGlobalDomain InitialKeyRepeat -int 15
Вот тут первая большая грабля. Ты записал значение, а в системе ничего не поменялось. Почему? Потому что между тобой и файлом стоит демон cfprefsd - он кэширует настройки в памяти и сам решает, когда сбросить их на диск. Многие приложения (Dock, Finder, SystemUIServer) тоже держат настройки в памяти и перечитывают plist только при старте. Поэтому правило:
Записал defaults - перезапусти того, кто эти настройки потребляет.
Для Dock и Finder это делается через killall - демон перезапустится автоматически (его держит launchd):

Код: Выделить всё

$ killall Dock
$ killall Finder
Если настройка глобальная и не подхватывается даже после рестарта приложения, можно пнуть сам кэш-демон. Он тоже под присмотром launchd и поднимется заново:

Код: Выделить всё

$ killall cfprefsd
Важный нюанс корректности: НЕ редактируй plist напрямую (через текстовый редактор или PlistBuddy) для тех приложений, что сейчас запущены - cfprefsd может перезаписать твою правку своей закэшированной версией. Пиши через defaults, и пусть система сама синхронизирует кэш.

Удаление возвращает ключ к дефолту (то есть удаляет твое переопределение):

Код: Выделить всё

$ defaults delete com.apple.dock tilesize
Область видимости: -currentHost и -g

Один и тот же ключ может жить в разных областях, и это путает новичков. Разберем три уровня для настройки macos.

Обычная запись (без флагов) идет в ~/Library/Preferences/ - настройка пользователя, общая для всех его машин (если у тебя iCloud-аккаунт на нескольких Mac, но синхронизации plist через iCloud нет, так что на практике - просто домашний preferences).

Флаг -currentHost привязывает настройку к ЭТОЙ физической машине. Файл уходит в ~/Library/Preferences/ByHost/ с Hardware UUID в имени. Так хранятся, например, настройки заставки и некоторые параметры экрана:

Код: Выделить всё

$ defaults -currentHost write com.apple.screensaver idleTime -int 600
$ ls ~/Library/Preferences/ByHost/ | grep screensaver
com.apple.screensaver.A1B2C3D4-....plist
Грабля: если ты прочитал настройку с -currentHost, а пишешь без него (или наоборот) - будешь смотреть в один файл, а менять другой, и сойдешь с ума, почему "не применяется". Читай и пиши в одной области.

Флаг -g (синонимы -globalDomain, NSGlobalDomain) - это глобальный домен, про который говорили выше. Пиши туда то, что должно влиять на все приложения сразу.

plutil: конвертация, проверка, точечная правка

defaults хорош для пар ключ-значение, но когда нужно посмотреть целый plist mac в человеческом виде или починить битый файл - берем plutil.

Проверить, что файл не поврежден (lint - линтер для plist):

Код: Выделить всё

$ plutil -lint ~/Library/Preferences/com.apple.dock.plist
/Users/you/Library/Preferences/com.apple.dock.plist: OK
Если вернет ошибку вместо OK - файл битый, и приложение будет вести себя странно. Лечение - удалить plist и дать системе пересоздать дефолтный.

Конвертация бинарного plist в читаемый XML на лету в stdout (исходник не трогаем, -o - значит вывод):

Код: Выделить всё

$ plutil -convert xml1 -o - ~/Library/Preferences/com.apple.dock.plist
Обратно в бинарь (binary1) - например, после ручной правки экспортированного файла перед раздачей:

Код: Выделить всё

$ plutil -convert binary1 mydock.plist
Современный plutil умеет точечно читать и писать без конвертации всего файла - через keypath:

Код: Выделить всё

$ plutil -extract tilesize raw ~/Library/Preferences/com.apple.dock.plist
48
Скрипт автонастройки нового Mac

Собираем все в один файл - это и есть основная ценность для админа. Такой скрипт прогоняется на свежей машине и за секунды приводит ее к твоему стандарту. Кусок реального macos.sh:

Код: Выделить всё

#!/bin/zsh
set -euo pipefail

# Finder: показывать расширения и скрытые файлы, путь в заголовке
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
defaults write com.apple.finder AppleShowAllFiles -bool true
defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"  # искать в текущей папке

# Dock: компактный, без недавних, автоскрытие
defaults write com.apple.dock tilesize -int 36
defaults write com.apple.dock show-recents -bool false
defaults write com.apple.dock autohide -bool true
defaults write com.apple.dock autohide-delay -float 0

# Клавиатура: быстрый повтор, без автозамены кавычек/тире
defaults write NSGlobalDomain KeyRepeat -int 2
defaults write NSGlobalDomain InitialKeyRepeat -int 15
defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false

# Скриншоты в PNG в отдельную папку
defaults write com.apple.screencapture type -string "png"
defaults write com.apple.screencapture location -string "${HOME}/Screenshots"
mkdir -p "${HOME}/Screenshots"

# Применяем
killall Dock
killall Finder
killall SystemUIServer
echo "Done. Some keyboard settings need a logout to fully apply."
Тонкости, которые экономят часы:
  • set -euo pipefail - скрипт падает при первой ошибке, а не молча едет дальше с кривым состоянием.
  • Часть глобальных настроек (особенно клавиатура) полностью применяется только после logout/login или перезагрузки - killall тут не помогает, перезапускать нужно пользовательскую сессию.
  • Перед раскаткой проверь имена ключей на СВОЕЙ версии macOS: меняй настройку в GUI и смотри diff через defaults read до и после. Ключи иногда переименовывают между релизами.
Способ узнать ключ "вживую" (отлов изменений) - снять снимок домена, поменять галочку в GUI, снять второй снимок и сравнить:

Код: Выделить всё

$ defaults read com.apple.dock > /tmp/before.txt
# ... меняешь галочку в Системных настройках ...
$ defaults read com.apple.dock > /tmp/after.txt
$ diff /tmp/before.txt /tmp/after.txt
< autohide = 0;
> autohide = 1;
Вот ты и нашел ключ autohide и его тип, не гугля.

Парк машин: профили конфигурации вместо скриптов

Скрипт на defaults - отличное решение для одной-двух машин или личной настройки. Но для парка из 50+ Mac у него есть слабости: он применяется один раз, пользователь может все отменить обратно, и нет централизованного контроля. Тут вступают профили конфигурации (.mobileconfig) - и это стандарт управления Mac в 2026.

Профиль конфигурации - это XML-plist с расширением .mobileconfig. Внутри top-level словарь с метаданными (идентификатор, UUID, организация) и массив payload-ов; каждый payload настраивает свою подсистему. MDM раздает профиль на машины, и настройки из него ложатся в /Library/Managed Preferences/. Ключевое отличие от defaults: эти настройки УПРАВЛЯЕМЫЕ - они имеют приоритет над пользовательскими, и юзер не может их перебить через GUI (галочка часто становится серой). Снес профиль - снялась и настройка.

В современном MDM поверх этого работает Declarative Device Management (DDM) - модель, где устройство само применяет и поддерживает декларации состояния, а не ждет команд от сервера. В 2026 это магистральный подход Apple для управления настройками парка.

Грубое правило выбора:
  • defaults-скрипт - личная машина, dev-окружение, разовая настройка, то что юзер вправе менять дальше сам.
  • Профиль конфигурации / MDM - корпоративный парк, политики безопасности, то что должно быть зафиксировано и не отменяемо пользователем.
Мини-лаба

Сделай руками, по шагам - так уляжется:
  • 1. Сними дамп: defaults read com.apple.dock > /tmp/before.txt
  • 2. Поменяй размер Dock из CLI: defaults write com.apple.dock tilesize -int 24, затем killall Dock. Глянь, что иконки уменьшились.
  • 3. Проверь тип: defaults read-type com.apple.dock tilesize - должно быть integer.
  • 4. Через GUI верни Dock в нормальный размер ползунком, сними второй дамп и сделай diff с before - найди, какой именно ключ изменился.
  • 5. Сконвертируй plist Dock в XML и посмотри глазами: plutil -convert xml1 -o - ~/Library/Preferences/com.apple.dock.plist | head -40
  • 6. Удали свое переопределение: defaults delete com.apple.dock tilesize, killall Dock - вернулся дефолт.
Контрольные вопросы
  • 1. Ты выполнил defaults write com.apple.dock autohide -bool true, но Dock не скрывается. Чего не хватает и почему?
  • 2. В чем разница между записью без флагов, с -currentHost и с -g? В какие файлы они пишут?
  • 3. Зачем нужен plutil -lint и что делать, если он вернул ошибку, а не OK?
  • 4. Почему для парка из 80 Mac профиль конфигурации лучше, чем defaults-скрипт, хотя оба меняют те же plist?
Итог

Системные настройки macOS - это GUI поверх системы user defaults, то есть поверх plist-файлов в ~/Library/Preferences и /Library/Preferences. Инструмент админа - defaults (read/read-type/write/delete/find), с пониманием доменов, типов и областей (-currentHost, -g). Помни про cfprefsd и обязательный killall Dock/Finder после записи. plutil чинит и конвертирует plist. Один defaults-скрипт превращает ручную настройку Mac в воспроизводимый код, а для парка машин эстафету принимают профили конфигурации и DDM. Дальше галочки мышкой - только для исследования ключей, а не для работы.
👍4 ❤️1 🔥2 😄 🤔2
Аватара пользователя
tanjagold
Сообщения: 1
Зарегистрирован: 11 май 2026, 13:18

Re: Системные настройки и их управление из CLI (defaults)

Сообщение tanjagold »

Тот diff before/after через defaults read - это база, мучился же раньше, искал ключи по форумам. Спасибо, добавил в свой setup-скрипт.
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
tcp_enjoyer
Сообщения: 1
Зарегистрирован: 23 май 2026, 03:54

Re: Системные настройки и их управление из CLI (defaults)

Сообщение tcp_enjoyer »

А правда что часть настроек клавиатуры применяется только после релогина? У меня KeyRepeat через killall не подхватывался, думал баг, а оно вон что.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Finder, рабочий стол и продуктивность
Следующая глава →
Пользователи и группы: учётные записи и управление

Все главы курса «macOS для профи: администрирование, терминал и Homebrew»

Поделиться темой: ✈ Telegram VK
Похожие запросы: defaults write и настройка macOS из терминалаТерминал и команды macOS

Вернуться в «macOS для профи: администрирование, терминал и Homebrew»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя