gpt4 book ai didi

cocoa - AuthorizationExecuteWithPrivileges() 作为 root 错误

转载 作者:行者123 更新时间:2023-12-03 16:16:03 28 4
gpt4 key购买 nike

我是 cocoa 的初学者......

我只想在我的 Cocoa 应用程序中启动 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);

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

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

最佳答案

我也遇到了同样的问题。 AuthorizationExecuteWithPrivileges 允许您将权限升级为 root,但不会自动执行(我猜是为了保留用户 session 或其他)。

我最终制作了一个通用可执行文件,该可执行文件将通过 AuthorizationExecuteWithPrivileges 运行,然后该可执行文件会将 uid 设置为 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

它将设置uid为root,然后使用给定的参数运行有问题的程序。

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

关于cocoa - AuthorizationExecuteWithPrivileges() 作为 root 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5660844/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com