У меня есть .pkg, который должен быть установлен. Это в основном для обновления моего приложения, имеющего несколько компонентов. Пакет содержит агента, демона и помощника. В Post скрипт запускаю Агента через Sudo $ USER launchctl load /Library/LaunchAgent/myApp.plist. Я хочу автоматизировать установку pkg. Для установки этого pkg используется командная строка установщика. Это прекрасно работает, когда я запускаю приложение из XCode и pkg чисто установлен.
Но когда я не запускаю свое приложение из режима отладки в XCode, и мое приложение установлено, и я пытаюсь установить pkg с помощью вспомогательного инструмента (работающего от имени пользователя root), выполняется команда установщика. Но проблема с загрузкой агента. Агент никогда не запускается.
Но когда я использую команду Su вместо команды SUDO, чтобы загрузить агента, который использует
su -l $ USER -c "/bin/launchctl load /Library/LaunchAgents/myApp.plist", агент запускается.
Но у меня возникли проблемы с использованием SU, из-за которого установка вспомогательного инструмента впоследствии не удалась.
Итак, 1. почему команда SUDO не работает и не может загрузить агента, когда он запускается из инструмента, работающего от имени пользователя root (Этот инструмент был запущен демоном).
- Если я загружаю Агента через SU, установка моего вспомогательного инструмента завершится неудачно.
Обновление:::: Я смог запустить Агент. Но проблема не устранена, потому что не удается установить вспомогательный инструмент, который пытается выполнить аутентификацию. Вот код аутентификации: AuthorizationRef authRef = NULL; AuthorizationItem authItem = {kSMRightBlessPrivilegedHelper, 0, NULL, 0}; AuthorizationRights authRights = {1, & authItem}; AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights;
OSStatus status=AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
if (status != errAuthorizationSuccess)
{
DLog(@"Failed to create AuthorizationRef, return code %i", status);
}
else
{
result = SMJobBless(kSMDomainSystemLaunchd, (__bridge CFStringRef)label, authRef, &outError);
if (!result && error)
{
*error = (__bridge NSError *)(outError);
}
}