Статья UNIX-команды macOS, которых нет в Linux: от say и defaults до sysadminctl

  • Автор темы Автор темы ADMIN
  • Дата начала Дата начала

ADMIN

Administrator
ADMIN
Регистрация
18 Окт 1989
Сообщения
1,408
Реакции
93
Баллы
48
☑ ДЕПОЗИТ
0$
UNIX-команды macOS, которые ставят в тупик тех, кто пришел с Linux

UNIX-команды macOS, которые ставят в тупик тех, кто пришел с Linux
macOS — сертифицированная UNIX система (формально — UNIX 03), и большая часть того, что набираешь в терминале, ведет себя, как в любом BSD: ls, grep, ps, ssh — все на месте. Но рядом лежит второй слой команд, которого нет ни в одном дистрибутиве Linux и нет в POSIX: defaults, sysadminctl, mdfind, say, afplay.

Часть из них выросла из архитектуры Darwin, часть — из графической и звуковой подсистем, а часть существует исключительно ради управления экосистемой Apple.

Таких утилит в macOS не один десяток, а в статье мы разобрали самые интересные и востребованные, по критериям: команда входит в macOS по умолчанию, не имеет штатного аналога в Linux и создавалась под задачи экосистемы Apple.

Откуда растут ноги: BSD, а не GNU​

macOS построена на базе операционной системы Darwin, которая сочетает в себе микроядро Mach и ядро BSD. Darwin был выпущен еще в 2000 году, и именно оттуда в систему попал BSD -userland, а не GNU coreutils. Отсюда все привычные грабли: у BSD-версий sed, ls, date ключи отличаются от тех, что у GNU. А поверх этой BSD-базы Apple десятилетиями наслаивала собственные утилиты, многие из них — наследие NeXTSTEP. Как раз о них и речь. Кому интересно, как система дошла до такой архитектуры, у нас есть отдельный разбор эволюции ОС Apple от NeXTSTEP до современной macOS.

af0f50111cf6ced2ef6d7ad644a343ce.png

say​

Что делает. Превращает текст в речь и либо проговаривает его через аудиовыход, либо пишет в файл: say "build finished".

Почему появилась. Синтез речи встроен в macOS как часть системы Accessibility → Speech (Универсальный доступ → Проговаривание текста), тем же движком озвучивается интерфейс для незрячих. say — это просто обертка командной строки (Command Line Interface — CLI) над системным синтезатором.

Пример. say -v '?' покажет список голосов (Alex, Samantha, русская Milena и десятки других), say -v Milena "Привет" выберет конкретный. Вывод можно писать в файл: say "готово" -o done.aiff. Классика жанра — озвучить окончание долгой задачи: make && say "done". Особенно весело звучит хор таких “Done”, когда настраиваешь скриптом сразу парк машин.

Чем отличается от Linux. В базовой системе Linux штатного TTS (Text To Speech) нет вообще. Аналоги ставятся пакетами: espeak/espeak-ng, festival, flite, обертка spd-say над Speech Dispatcher. Работают, но это всегда сторонний софт, а не часть ОС.

Интересный факт. Синтез речи в маках восходит к 1984 году: на презентации первого Macintosh компьютер сам произнес приветствие со сцены. Голос Fred, доживший до современных версий, по легенде основан на сэмпле одного из членов оригинальной команды Macintosh.

afplay​

Что делает. Проигрывает аудиофайл прямо из терминала: afplay alert.wav. Расшифровывается как Audio File Play.

Почему появилась. Это CLI-надстройка над аудиостеком macOS (CoreAudio). Систему звука Apple унифицировала, поэтому одна утилита играет все — aiff, m4a, mp3, wav, flac.

Пример. afplay --rate 2 track.mp3 ускорит воспроизведение вдвое, afplay --time 5 track.mp3 проиграет первые пять секунд. Рядом живут afinfo (метаданные файла) и afconvert (конвертация).

Чем отличается от Linux. В Linux нет единого проигрывателя такого уровня: aplay — часть Advanced Linux Sound Architecture и работает через ядро-драйверы, paplay/pacat — клиенты PulseAudio, есть еще PipeWire. То есть команда завязана на конкретную звуковую подсистему, тогда как afplay всегда идет через один CoreAudio.

open​

Что делает. Открывает файл, папку, URL или приложение так, будто вы дважды кликнули по нему в Finder в ассоциированной по типу программе. open report.pdf откроет PDF в дефолтном просмотровщике.

Почему появилась. Это мост между CLI и графической оболочкой: open запрашивает Launch Services — ту же подсистему, что решает, каким приложением открывать тип файла при двойном клике. Без него из терминала не «пробросить» файл в GUI-приложение штатным способом.

Пример. open . откроет текущую папку в Finder, open https://habr.com — ссылку в браузере, open -R ~/file.log покажет файл в Finder (R - reveal), open -e notes.txt откроет файл именно в TextEdit.

Чем отличается от Linux. Прямой аналог — xdg-open из пакета xdg-utils (freedesktop). Логика та же: открыть в приложении по умолчанию, но xdg-open тоже не всегда есть в базовой системе и работает в рамках desktop-сессии, опираясь на MIME-ассоциации, а не на Launch Services.

defaults​

Что делает. Читает и пишет настройки приложений и системы, которые хранятся в plist-файлах. Настройки разложены по доменам: defaults read com.apple.finder, defaults write com.apple.dock autohide -bool true.

Почему появилась. В macOS настройки — это не разрозненные dot-файлы, а централизованная система preferences (CFPreferences/NSUserDefaults) с доменами и типами данных. defaults — консольный интерфейс к ней. Утилита пришла еще из NeXTSTEP, где само слово «defaults» и означало пользовательские настройки.

Пример. defaults write NSGlobalDomain AppleShowAllExtensions -bool true — показывает все расширения файлов. После записи приложение обычно надо перезапустить (killall Finder), чтобы оно перечитало значение. К слову, через defaults (в связке с softwareupdate) удобно управлять и поведением апдейтов, мы подробно разбирали это в статье о том, как устроены обновления macOS.

Чем отличается от Linux. В Linux нет единого системного реестра настроек. Ближайший аналог — dconf/gsettings, но это стек GNOME; KDE использует свой KConfig, а масса приложений — обычные текстовые конфиги. Общего для всей ОС «defaults» в Linux не существует.

Интересный факт. Сам формат plist — тоже наследие NeXTSTEP. В Mac OS X текстовый формат уступил место XML, а с версии 10.2 появился бинарный plist, ставший форматом по умолчанию.

sysadminctl​

Что делает. Администрирует локальные учетки из CLI: создание, удаление, смена паролей и, что ценят Apple-админы, управление статусом Secure Token.

Почему появилась. Apple добавила sysadminctl ещё в OS X 10.10 (2014) как современную CLI-замену древнего dscl для работы с учетными записями. К High Sierra (10.13, 2017) она стала рекомендуемым инструментом для управления пользователями из командной строки. А управление Secure Token появилось в ней позже вместе с APFS (файловая система Apple). Этот атрибут файловой системы решает, кто может разблокировать FileVault, а sysadminctl оказался тем местом, куда Apple поместила работу с ним.

Пример. sysadminctl -addUser john -fullName "John" -password - создаст пользователя, а sudo sysadminctl -secureTokenOn john -password userpw -adminUser admin -adminPassword adminpw выдаст ему Secure Token. Обратите внимание: операция всегда требует учетки существующего администратора с токеном.

Чем отличается от Linux. Аналоги — useradd/userdel/passwd, но в Linux нет концепции Secure Token. Шифрование диска (LUKS/cryptsetup) не привязано к атрибуту учетки: том открывается парольной фразой или ключом, а не токеном конкретного пользователя. Модель, где право разблокировать FDE (Full-Disk Encryption) закреплено за пользователем, специфична для APFS. Подробно эту механику мы разбирали в материале про Secure Token и Bootstrap Token, а ее роль в шифровании — в статье про устройство FileVault.

Интересный факт. sysadminctl не позволит удалить последнего администратора или последнего владельца Secure Token , так утилита защищает Mac от окирпичивания.

Почему defaults и PlistBuddy — это не одно и то же​

Самый частый источник багов в скриптах для мака. Оба инструмента вроде бы «правят plist», но делают это на разных уровнях. Настройки в macOS — это слоеный пирог: API (NSUserDefaults/CFPreferences) → демон-кэш → файл на диске.

535d5fe1fbc7613b6c90a6af30342486.png

defaults работает через демон cfprefsd: он держит настройки в кэше в памяти, знает, где именно лежит активный файл (в /Library/Preferences, ~/Library/Preferences или их ByHost-подпапках), и рассылает уведомления об изменениях. PlistBuddy (лежит по пути /usr/libexec/PlistBuddy) правит файл на диске напрямую как структуру данных, ничего не зная про кэш.

Отсюда главная грабля: если PlistBuddy изменит plist домена настроек, пока cfprefsd держит его в кэше, ваша правка может быть просто затерта — демон запишет закэшированные значения поверх файла.

Поэтому правило простое: для доменов настроек — defaults (или, если очень надо PlistBuddy, следом запускать killall -u $USER cfprefsd, чтобы сбросить кэш). А PlistBuddy незаменим там, где никакого cfprefsd в цепочке нет: Info.plist, plist демонов LaunchDaemon/LaunchAgent, файлы на не загруженном томе. Кстати, сама man-страница defaults предупреждает не использовать его для произвольного редактирования plist — для этого есть plutil и PlistBuddy.

Почему command not found: PlistBuddy. Каталог /usr/libexec не входит в пользовательский $PATH, поэтому shell не находит утилиту только по имени — вызывайте ее полным путем: /usr/libexec/PlistBuddy -c "Print" file.plist. Если работаете с ней часто, допишите каталог в PATH в ~/.zshrc: export PATH="$PATH:/usr/libexec".

После source ~/.zshrc команда PlistBuddy заработает без пути. Тот же прием, кстати, открывает и другие служебные бинарники из /usr/libexec.

Команды, которые оценят MDM-инженеры​

Отдельная группа утилит, которые линуксоид не встретит нигде, потому что они завязаны на модели управления устройствами Apple.

profiles​

Управление конфигурационными профилями (.mobileconfig). Здесь важнейший нюанс, на котором спотыкаются мигрирующие со старых гайдов: начиная с macOS 11 Big Sur команда больше не умеет устанавливать профили из CLI. profiles install мертв для локального запуска — Apple убрала это ради безопасности. Что осталось рабочим: profiles list (список установленных), profiles status -type enrollment (MDM-статус, показывает флаг User Approved), profiles renew -type enrollment (обновление enrollment), profiles remove. Установка профилей теперь идет либо через MDM «тихо» на устройство с одобренным enrollment, либо вручную пользователем в System Settings.

systemextensionsctl​

Инспекция и управление системными расширениями — user-space заменой kernel extensions (kext), которую Apple продвигает с macOS Catalina. systemextensionsctl list покажет установленные расширения и их состояния (activated enabled, activated waiting for user), systemextensionsctl developer on включит режим разработчика. Концептуально ближайший родич в Linux — работа с модулями ядра (lsmod/modprobe), но модель с подписью и одобрением пользователем/MDM чисто маковская.

tccutil​

Работа с базой приватности TCC (Transparency, Consent, and Control), где хранятся решения о доступе приложений к камере, микрофону, диску, записи экрана. Критично понимать: tccutil умеет только сбрасывать разрешения, но не выдавать. tccutil reset Camera или sudo tccutil reset ScreenCapture com.google.Chrome обнулят решения, и система снова спросит пользователя. Выдать доступ можно только явным согласием пользователя или PPPC-профилем через MDM, причем камеру и микрофон даже MDM не может разрешить удаленно. Типовой сценарий reset — починка залипших разрешений после обновления приложения. Как эта система приватности вообще появилась и эволюционировала, мы разбирали в краткой истории защиты конфиденциальности на Mac.

security​

CLI к keychain и Security framework. security find-certificate -a -p выгрузит сертификаты, security unlock-keychain login.keychain разблокирует связку, security add-trusted-cert добавит доверенный корневой сертификат в System.keychain. В Linux эта функциональность разнесена: секреты — в GNOME Keyring/KWallet через Secret Service API, доверенные CA — в системном trust store (update-ca-certificates). security собирает все это одной командой.

Что еще есть в арсенале: короткий список​

Раздел факультативный , просто чтобы знать, что эти команды существуют и гуглить их по имени, когда понадобится. Все они Apple-специфичны и прямых двойников в Linux обычно не имеют:

  • pbcopy / pbpaste — буфер обмена (pasteboard) из CLI в GUI: cat file | pbcopy, pbpaste > out.txt. В Linux роль играют xclip/xsel или wl-copy.
  • networksetup — конфигурация сети из терминала: Wi-Fi, DNS, прокси, сетевые сервисы.
  • scutil — System Configuration: изменить имя хоста (scutil --set HostName), показать или изменить сетевые настройки.
  • diskutil — управление дисками и томами: diskutil list, работа с APFS-контейнерами, форматирование, монтирование. Аналог связки lsblk/mount/parted.
  • caffeinate — не давать Mac засыпать: caffeinate -i ./long_job.sh удержит систему бодрствующей на время выполнения команды.
  • mdfind — поиск через индекс Spotlight из CLI: mdfind "МинВоды". Быстрее find, потому что идет по индексу метаданных, а не обходит ФС.
  • softwareupdate — обновления macOS из терминала: список, загрузка, установка. Незаменима в скриптах и MDM-сценариях (см. также разбор про обновления macOS).
  • spctl — управление политиками Gatekeeper: spctl --status покажет статус, оценка приложений и правил допуска к запуску.
  • system_profiler — полный отчет о железе и софте: system_profiler SPHardwareDataType. Машиночитаемый вывод удобно обрабатывать прискармливать инвентаризации.

Итог: собственный набор командных утилит Apple​

За годы Apple обросла целым арсеналом собственных утилит командной строки — под звук, речь, настройки, шифрование, поиск, управление устройствами. Часть из них выглядит непривычно (defaults вместо редактирования конфиг-файлов), часть кажется избыточной (say в базовой поставке), но многие оказываются неожиданно удобными, особенно когда приходится администрировать парк маков, а не один ноутбук.

А какие «неочевидные» команды macOS выручали вас в скриптах и при разборе инцидентов? Особенно интересны находки тех, кто пришел с Linux, что показалось диким, а что в итоге прижилось. Делитесь в комментариях.
 
Защита от мошенничества: Использование посредника минимизирует риски столкнуться с «продавцами-однодневками» или недобросовестными заказчиками, которые исчезают после получения предоплаты или результата работы.
Назад
Сверху