Если root
является одной из вспомогательных групп, вам нужно будет использовать getgroups()
и setgroups()
для настройки списка вспомогательных групп - удалив root
(0) из этого списка , Обратите внимание, что POSIX указывает getgroups()
, но не указывает setgroups()
.
Возможно, вы могли бы использовать код, подобный следующему:
enum { MAX_AUX_GROUPS = 16 }; // Reasonable number
enum { ROOT_GROUP = 0 }; // Platform specific
gid_t aux_groups[MAX_AUX_GROUPS];
int ngroups = getgroups(MAX_AUX_GROUPS, aux_groups);
if (ngroups > 0)
{
int dst = 0;
for (int i = 0; i < ngroups; i++)
{
if (aux_groups[i] != ROOT_GROUP)
aux_groups[dst++] = aux_groups[i];
}
ngroups = dst;
}
if (ngroups > 0)
{
if (setgroups(ngroups, aux_groups) != 0)
...report error...
}
Обратите внимание, что группа root
равна 0 в Linux, но имя группы 0 не всегда root
(например, это system
в AIX и wheel
в MacOS X), и не все системы имеют группа root
(ни AIX, ни MacOS X, опять же). Также обратите внимание, что ядро не предоставляет никаких специальных привилегий группе 0, поскольку оно является группой 0 (тогда как оно предоставляет специальные привилегии пользователю 0).
Вы можете обобщить код, найдя группы, которые вы хотите опустить. POSIX также предоставляет NGROUPS_MAX; Вы можете использовать это вместо MAX_AUX_GROUPS. Стандартная страница также предлагает:
long ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
gid_t *group = (gid_t *)malloc(ngroups_max *sizeof(gid_t));