通过AuthorizationExecuteWithPrivileges运行sh脚本

3

我正在通过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)。

1个回答

0

首先,您不应该在已经以root身份运行的脚本中使用sudo。在默认的Mac设置下,这不应该会引起问题,但这取决于用户如何配置sudoers。这仍然是我怀疑出现问题的最大原因。

接下来,当此脚本运行时,您是否在控制台上收到任何错误消息?您提到其他事情正在运行;它们是在此之前还是之后?您是否检查了此脚本行的unix错误结果?

我假设您已经阅读了创建launchd Daemons和Agents

您说脚本正在运行,所以我假设它实际上具有扩展名.sh,并且pFileName不包括“.sh”。

TN2083没有提及AuthorizationExecuteWithPrivileges。您所说的“如TN2083所述”是什么意思?

我假设您没有在脚本上设置setuid位,对吗?这将使AuthorizationExecuteWithPrivileges出现问题。


你的所有假设都是正确的。在launchctl之前和之后,我都有“rm file”,当我注意到问题时,唯一没有正确执行的命令是launchctl。此外,当我提到TN2083时,我指的是“EUID和RUID”为0以使launchctl运行。脚本中也没有设置setuid位。卸载脚本在其他项目上运行良好。但是当我将其移植到Cocoa应用程序时,就开始看到与launchctl相关的问题了。 - Daesuk Chai
你尝试过去掉“sudo”吗?在这一点上,你已经是root了。 - Rob Napier
你需要查看控制台日志并了解发生了什么。在运行授权环境时最常见的问题之一是忘记了像PATH这样的东西可能与您的shell设置不同。您可以尝试提供可执行文件的完整路径。日志中应该会有一些错误。如果您无法找到错误,还可以使用“cmd 2>&1 >> /tmp/outfile”将stdout和stderr都放入日志文件中,以便您可以查看错误。 - Rob Napier
不要使用相对路径,而应该始终使用完整路径,除非您在应用程序中硬编码了一个安全的PATH(这是另一个好主意)。否则,攻击者可以在某个地方安装一个恶意程序并将其命名为“launchctl”,然后通过~/.MacOSX/environment.plist设置用户的PATH,使您的程序以root身份运行它。 - Peter Hosey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接