3

我是可可的初学者...

我只想在我的 Cocoa App 中启动 Apache 和其他进程。

这是我的代码:

    OSStatus myStatus;
    AuthorizationFlags myFlags = kAuthorizationFlagDefaults;
    AuthorizationRef myAuthorizationRef;
    FILE *pipe = NULL;
    myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, myFlags, &myAuthorizationRef);
    AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0};
    AuthorizationRights myRights = {1, &myItems};
    myFlags = kAuthorizationFlagDefaults | 
    kAuthorizationFlagInteractionAllowed |
    kAuthorizationFlagPreAuthorize |
    kAuthorizationFlagExtendRights;
    myStatus = AuthorizationCopyPrivilegedReference (&myAuthorizationRef,kAuthorizationFlagDefaults);
    myStatus = AuthorizationCopyRights (myAuthorizationRef,&myRights, NULL, myFlags, NULL ); 

    char *tool = "/usr/sbin/apachectl";
    char *args[] = { "start",NULL} ;    

    myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe);
    char c[100];
    int n=fread(c,1,100,pipe);
    c[n] = '\0';
    NSLog(@"%s\n",c);

theResult : 此操作需要 root
当我运行'whoami'时,我是 ' root'但是当我运行getuid()时,我是 ' 501' ...

我尝试使用 setuid(0); 但它没有设置!
你能帮助我吗?
谢谢

4

3 回答 3

14

我有这个完全相同的问题。AuthorizationExecuteWithPrivileges 允许您将权限升级到 root,但不会自动执行(我想保留用户会话或其他)。

我最终制作了一个通用的可执行文件,该可执行文件将通过 AuthorizationExecuteWithPrivileges 运行,然后该可执行文件将 setuid 设置为 root,然后执行您实际希望以 root 身份运行的进程。

这是 setuid 包装器可执行文件的源代码:

#include <stdio.h>

int main(int argc, char** argv) {
  if (argc < 2) {
    printf("not enough arguments\n");
    return -1;
  }
  if (0 != setuid(0)) {
    printf("setuid failed.\n");
    return -3;
  }
  int i;
  char** argvz = (char**)malloc(sizeof(char*) * (argc - 1));
  for (i = 1; i < argc; i++) {
    argvz[i - 1] = argv[i];
  }

  execv(argv[1], argvz);
  printf("execv returned?\n");
  return -2;
}

然后,基本上运行(通过 AuthorizationExecuteWithPrivileges 调用它)它:

setuid my-program-to-run and arguments to pass

它将 setuid 作为 root,然后使用给定的 args 运行有问题的程序。

请注意,您必须从 AuthorizationExecuteWithPrivileges 调用 setuid 因为只有 AuthorizationExecuteWithPrivileges 创建的 pid 将具有升级的权限(并且 setuid 将执行并用您自己的进程替换该进程)。

于 2011-12-27T23:07:55.557 回答
0

我会在 /etc/sudoers 中为 uid=501 访问 /usr/sbin/apachectl 的用户定义访问权限,并在代码中执行“sudo /usr/sbin/apachectl”而不是 /usr/sbin/apachectl。

于 2011-04-15T15:18:23.367 回答
0

我面临着完全相同的问题!whoami 返回“root”而 root 命令返回“root required”,这太疯狂了!sudoers 解决方案可能有效,但我认为我们必须搜索 setuid 位,如此处所述https://github.com/notbrien/OSXSlightlyBetterAuth/blob/master/OSXSlightlyBetterAuth.m#L94

于 2011-04-29T15:41:22.210 回答