我有一个需要安装的 .pkg。这主要用于更新具有多个组件的应用程序。pkg 包含 Agent、Daemon 和一个助手。在 Post 脚本中,我通过 Sudo $USER launchctl load /Library/LaunchAgent/myApp.plist 启动 Agent。我想自动安装 pkg。安装程序命令行用于安装此 pkg。当我从 Xcode 运行应用程序并且 pkg 已干净安装时,这可以正常工作。
但是当我没有在 Xcode 中从调试模式运行我的应用程序并且我的应用程序已安装时,我尝试在辅助工具的帮助下安装 pkg(以 root 身份运行),安装程序命令正在执行。但问题在于代理的加载。代理从未启动。
但是当我使用 Su 命令而不是 SUDO 命令来加载使用
su -l $USER -c "/bin/launchctl load /Library/LaunchAgents/myApp.plist" 的代理时,代理就会启动。
但是我在使用 SU 时遇到了问题,辅助工具安装随后失败。
那么 1. 为什么当从以 root 身份运行的工具运行 SUDO 命令时会失败并且无法加载代理。(该工具由守护进程启动)。
- 如果我通过 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);
}
}