我有以下代码段。
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将作为原始用户运行?有更好的方法吗?
答案 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
现在返回原始用户