【问题标题】:Running sh script through AuthorizationExecuteWithPrivileges通过 AuthorizationExecuteWithPrivileges 运行 sh 脚本
【发布时间】:2009-07-22 00:23:30
【问题描述】:

我正在通过 cocoa 应用程序运行卸载脚本,我注意到 launchctl 命令没有被执行。

这是调用脚本的部分代码(其中包含 sudo launchctl unload "name of the daemon")

//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)。

【问题讨论】:

    标签: cocoa macos shell


    【解决方案1】:

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

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

    我假设你已经阅读了Creating launchd Daemons and Agents

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

    TN2083 没有引用AuthorizationExecuteWithPrivileges。 “如 TN2083 所述”是什么意思?

    我假设您没有在脚本上设置 setuid 位,对吗?这会给您带来AuthorizationExecuteWithPrivileges 的麻烦。

    【讨论】:

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