设置 euid posix_spawn

set euid with posix_spawn

我有以下代码片段。

char *const parmList[] = {"sh", "-c", "whoami", NULL};
if(geteuid() == 0) {
   seteuid(atoi(getenv("SUDO_UID")));
}
posix_spawn(&pid, "/bin/sh", NULL, NULL, parmList, environ);

根据我的理解,posix_spawn 的默认行为是:

If the POSIX_SPAWN_RESETIDS flag is not set, the child process shall inherit the parent process' effective user ID.

但是,当我 运行 我的程序使用 sudo 时,我仍然得到 root 作为 posix_spawn 的输出。我如何才能让 posix_spawn 成为原始用户 运行?有更好的方法吗?

我最终通过创建一个 forks 然后 execs

的函数来完成这个
pid_t runCmd(char *cmd) {
    if(!cmd) return -1;

    pid_t ans = fork();
    if(ans == 0) {
        if(geteuid() == 0) {
            int uid = atoi(getenv("SUDO_UID"));
            setreuid(uid, uid);
        }
        if(verbose_flag) println("uid %d; euid %d", getuid(), geteuid());
        char *const parmList[] = {"sh", "-c", cmd, NULL};
        execv("/bin/sh", parmList);
    }
    return ans;
}

whoami现在returns原用户