我在许多开源项目中看到了这样的逻辑:
if (setuid() == 0) {
   if (setgid(ccf->group) == -1) {
   ...
   if (initgroups(ccf->username, ccf->group) == -1) {
我有2个问题:
initgroups为了?IMO,改变GID和UID,setuid()以及setgid()就足够了.大多数情况下,系统守护进程由 init 脚本生成,因此作为root. 调用setuid()并setgid()允许他们放弃超级用户权限并模拟系统上的另一个用户(通常远不如 强大root)。这样,错误和安全漏洞对系统的致命性就会降低。
关于您问题的第二部分,调用initgroups()以重新初始化组访问列表并添加ccf->group到ccf->username所属组的列表中。这可能是因为调用setgid()不足以将与新组关联的访问权限传播到进程。