我正在通过 cocoa 应用程序运行卸载脚本,我注意到 launchctl 命令没有被执行。
这是调用脚本的代码部分(其中包含 sudo launchctl unload“守护进程的名称”)
//pFileName is the name of the File
NSString* pPath = [pCurrentBundle pathForResource:pFileName ofType:@"sh"];
char* const ppArgs[] = {const_cast<char*>([pPath fileSystemRepresentation]), NULL};
OSStatus status = AuthorizationExecuteWithPrivileges(m_AuthorizationRef, "/bin/sh", kAuthorizationFlagDefaults, ppArgs, NULL);
由于所有其他脚本命令都正确执行(并且它在终端中正常卸载),我猜测我没有与 TN2083 状态的 root 相同的权限(EUID 和 RUID 均为 0)。
最佳答案
首先,您不应该在已经以 root 身份运行的脚本中使用 sudo
。在默认的 Mac 设置下,它不会导致问题,但这取决于用户如何配置 sudoers。这仍然是我对破坏的最大怀疑。
接下来,当它运行时,您是否收到任何错误消息到控制台?你提到其他事情正在运行;他们是在这之前还是之后?您是否正在检查此脚本行的 unix 错误结果?
我假设您已阅读 Creating launchd Daemons and Agents .
您说脚本正在运行,所以我假设它实际上具有扩展名 .sh 并且 pFileName 不包含“.sh”。
TN2083 没有引用 AuthorizationExecuteWithPrivileges
。 “如 TN2083 所述”是什么意思?
我假设您没有在脚本上设置 setuid 位,对吗?这会给您带来 AuthorizationExecuteWithPrivileges
的麻烦。
关于cocoa - 通过 AuthorizationExecuteWithPrivileges 运行 sh 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1162448/