【问题标题】:How to run NSTask or a subprocess as a different user on macOS如何在 macOS 上以不同用户身份运行 NSTask 或子进程
【发布时间】:2019-04-13 16:59:32
【问题描述】:

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

我需要以当前登录的用户身份执行命令行工具(我可以通过getting the HOME env var 确定)。 (详见下文)

我该怎么做,最好使用NSTask

我知道如何以当前(root)用户身份使用 NSTask 来执行该工具,所以我只需要知道我需要对此进行哪些更改。

或者,有没有办法在不同的用户 ID 下运行我的程序代码的一部分?

细化

特别是,该程序是由AuthorizationExecuteWithPrivileges发起的。有趣的是,这为程序提供了与使用 sudo 启动程序时略有不同的环境:

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

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

【问题讨论】:

  • 考虑重构您的设计以临时以 root 身份运行当前用户(这是通常的方式),而不是以 root 作为当前用户。还要考虑以 root 身份永久运行应用程序可能会导致安全问题。
  • 我知道。但这对我来说目前不是一个选择。此外,即使我写了“应用程序”,这个问题也适用于以 root 身份运行的任何后台进程 - 它可能需要执行工具,并且出于安全原因,它应该能够以较低的权限运行它们。
  • 当前登录的用户是什么?当前可能有多个用户登录!?

标签: macos nstask


【解决方案1】:

有人建议使用fork函数,然后在forked进程中调用setuid,然后再使用NSTask或system()运行外部命令。

这是如何完成的:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 2010-12-18
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2018-01-26
    相关资源
    最近更新 更多