Disclaimer: приведенные здесь методы успешно работают в macOS Mojave, Catalina и Big Sur, но для боевых систем рекомендуется всегда проводить собственные тесты собранных пакетов.

Как-то так вышло, что раньше я довольно скептически относился к macOS, поскольку не имел возможности поработать с ней в более-менее устоявшейся корпоративной среде (т.е. не когда на всю компанию в 500-600 человек есть 2 мака, и те у генерального с его замом, да еще и с виндой в буткемпе). Но несколько лет назад мне повезло познакомиться с очень масштабной гетерогенной средой, показавшей, что в современных компаниях macOS не только успешно сосуществует с привычной Windows, но иногда и превалирует над ней в общей доле клиентских машин.

Позднее я оказался в другой компании, где отсутствовали привычные инструменты управления парком (а непривычные оказались недоступны из-за серьезных ограничений для региональных подразделений, в одно из которых я и входил). Проводить настройку и устанавливать софт "руками" я не люблю практически с самого начала своей карьеры – отлаженный сценарий экономит время и нервы, поэтому я начал искать варианты установки ПО на macOS.

Часть приложений распространяется в формате PKG – это пакет, сформированный специально для обработки приложением Installer, позволяющий провести установку как из графического интерфейса, так и из консоли (например, так: installer -pkg $pkgfile -target /Applications). В идеале хотелось бы иметь пакеты в таком формате для всего стандартного ПО, распространяемого на клиентские машины, к этому и будем стремиться.

К сожалению, существенная часть ПО распространяется в виде DMG-образов, позволяющих просто примонтировать скачанный файл-образ и скопировать подготовленное приложение (обычно в формате .app) в каталог /Applications. К счастью, перепаковать такое приложение практически не составляет труда:

  1. монтируем dmg-образ;

  2. копируем приложение к себе на машину (каталог не имеет большого значения, но лучше следовать канонам – стандартный каталог для приложений /Applications);

  3. выполняем в терминале следующую команду:
    productbuild --component /path/to/YourApplication.app /Applications/ /path/to/YourApplication.pkg
    (сначала указываем путь к скопированному приложению, далее идет опция, говорящая, что установка из пакета будет проводиться в каталог /Applications, и в финале задаем путь к создаваемому пакету, рекомендую везде использовать полные пути)

В результате получаем установочный пакет, одинаково успешно ведущий себя как при графической, так и при консольной процедуре установки. Да, установку из DMG-образа вполне можно реализовать, монтируя образ через hdiutil и копируя приложение, но этот вариант показался мне менее универсальным.

Иногда может потребоваться выполнить какие-то действия с системой, которые в обычных условиях можно было бы реализовать с помощью удаленного вызова или, например, shell-скриптов, но, предположим, что удаленного доступа к машине нет, а пользователь не горит желанием открывать консоль (если вообще знает, что это, ну и будем реалистами, ему и не надо). Система позволяет создавать подобие т.н. payload-free пакетов (в которые при желании можно все равно запихнуть некоторый payload) – в формируемом пакете основной интерес для нас будет представлять файл postinstall – тот же shell-скрипт, но выполняющийся в рамках работы с установочным пакетом.

Создадим папку scripts(я предпочитаю создавать каталоги в местах, где точно обладаю необходимыми правами, например, домашний каталог и его дочерние папки), в нее необходимо поместить весь контент, который потребуется для выполнения сценария (например, если вы осуществляете настройку принтера на клиентской машине, в пакет можно включить файл драйвера .ppd).

После того, как все необходимые файлы скопированы, открываем терминал, переходим с его помощью внутрь каталога scripts и выполняем команду pico postinstall. Откроется стандартный консольный текстовый редактор (обычно, если вы ничего не меняли, это будет nano), в редактор необходимо ввести или скопировать текст вашего сценария, для примера приведу сценарий, меняющий параметры времени/таймзоны:

#!/bin/bash
ntp="time.euro.apple.com"
sudo /usr/sbin/systemsetup -setusingnetworktime on
sudo /usr/sbin/systemsetup -setnetworktimeserver "$ntp"
exit 0

После заполнения сценария всеми необходимыми операциями нажимаем Ctrl+X для выхода из редактора (жмем Y на вопрос о сохранении изменений, разумеется), но из терминала не выходим. Скрипт должен считаться исполняемым, добавляем ему соответствующие права командой sudo chmod a+x postinstall (вводим пароль при необходимости).

Создаем наш пакет следующей командой:
sudo pkgbuild --identifier com.package.name --nopayload --scripts /path/to/scripts/ "/path/to/your_package.pkg"
(в качестве идентификатора по идее надо указывать что-то, что позволит однозначно определить назначение пакета, пути по традиции указываем полные).

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