我是可可的初学者......
我只想在我的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);但它没有设置!!
你能帮助我吗?
谢谢
答案 0 :(得分: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
它将以root身份setuid,然后使用给定的args运行相关程序。
请注意,您必须从AuthorizationExecuteWithPrivileges调用setuid因为只有AuthorizationExecuteWithPrivileges创建的pid才会具有升级权限(并且setuid将执行并用您自己的进程替换该进程)。
答案 1 :(得分:0)
我将为/ etc / sudoers中的/ usr / sbin / apachectl访问uid = 501的用户定义访问权限,并在代码中执行“sudo / usr / sbin / apachectl”而不是/ usr / sbin / apachectl。
答案 2 :(得分:0)
我面临着同样的问题! 这是疯了,whoami返回“root”,root命令返回“root required”!! sudoers解决方案可能有效,但我认为我们必须搜索setuid位,如此处所写https://github.com/notbrien/OSXSlightlyBetterAuth/blob/master/OSXSlightlyBetterAuth.m#L94