如何在macOS上以其他用户身份运行NSTask或子进程

时间:2019-04-13 16:59:33

标签: macos nstask

我有一个以root用户身份运行的程序(getuid()返回0)。

我需要以当前登录的用户身份执行命令行工具(我可以由getting the HOME env var确定)。 (有关详细说明,请参见下文)

我该如何做,最好是使用NSTask

我知道如何使用NSTask作为当前(根)用户来执行该工具,所以我所需要的就是知道我需要对此进行哪些更改。

或者,是否可以在其他用户的ID下运行程序代码的一部分?

详细说明

特别地,所述程序由AuthorizationExecuteWithPrivileges启动。有趣的是,这为程序提供了与使用sudo启动程序时稍有不同的环境:

使用sudo,实际和有效的用户(来自getuid()geteuid())都是“ root”。

但是,对于AuthorizationExecuteWithPrivileges,有效用户仍然是调用该函数的用户。这有一些奇怪的效果,例如然后我的测试显示,该程序使用NSUserDefaults,因为它们最终位于不同的域中。

1 个答案:

答案 0 :(得分:0)

有人建议在使用NSTask或system()运行外部命令之前,先使用fork函数,然后在派生进程中调用setuid

这是这样做的方式:

int userID = 501; // or whatever user you need to be
assert (geteuid() == 0); // are we root?
pid_t pid;
if ((pid = fork()) == 0) {
    setuid(userID);
    int res = system("...");
    exit (res);
} else {
    // wait for the forked process to finish
    pid_t endid;
    do {
        int status;
        endid = waitpid (pid, &status, WNOHANG|WUNTRACED);
    } while (endid == 0);
}