设置 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 成为原始用户 运行?有更好的方法吗?
我最终通过创建一个 fork
s 然后 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
现在returns原用户
我有以下代码片段。
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 成为原始用户 运行?有更好的方法吗?
我最终通过创建一个 fork
s 然后 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
现在returns原用户