用posix_spawn设置euid

时间:2016-11-10 16:23:29

标签: c macos unix posix

我有以下代码段。

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的默认行为是:

  

如果未设置POSIX_SPAWN_RESETIDS标志,则子进程应继承父进程的有效用户ID。

但是,当我使用sudo运行我的程序时,我仍然会root作为posix_spawn的输出。我如何拥有它所以posix_spawn将作为原始用户运行?有更好的方法吗?

1 个答案:

答案 0 :(得分:-1)

我最终通过创建fork然后exec s

的函数来完成此操作
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现在返回原始用户