我有一个以root用户身份运行的程序(getuid()
返回0)。
我需要以当前登录的用户身份执行命令行工具(我可以由getting the HOME env var确定)。 (有关详细说明,请参见下文)
我该如何做,最好是使用NSTask
?
我知道如何使用NSTask作为当前(根)用户来执行该工具,所以我所需要的就是知道我需要对此进行哪些更改。
或者,是否可以在其他用户的ID下运行程序代码的一部分?
详细说明
特别地,所述程序由AuthorizationExecuteWithPrivileges
启动。有趣的是,这为程序提供了与使用sudo启动程序时稍有不同的环境:
使用sudo,实际和有效的用户(来自getuid()
和geteuid()
)都是“ root”。
但是,对于AuthorizationExecuteWithPrivileges
,有效用户仍然是调用该函数的用户。这有一些奇怪的效果,例如然后我的测试显示,该程序使用NSUserDefaults,因为它们最终位于不同的域中。
答案 0 :(得分:0)
有人建议在使用NSTask或system()运行外部命令之前,先使用fork
函数,然后在派生进程中调用setuid
。
这是这样做的方式:
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);
}