2009-09-28 3 views
0

Командные сообщения linux 'id' для групп = , к которому относится процесс. Когда и как это заполняется?linux id no_squash_root

Я пишу программу suid/sgid, и кажется, что группы никогда не заполняются для моего процесса и, возможно, только по совпадению, но разрешения в отношении смонтированной файловой системы nfs также не работают должным образом (или кстати, я играл с no_root_squash, и это не помогло)

+0

Возможно, вы могли бы опубликовать некоторый код и/или расшифровку оболочки, показывающую, что именно вы видите, что отличается от того, где вы ожидаете? Правильно ли работает ваша программа, если не в файловой системе NFS? –

ответ

2

В большинстве случаев дополнительные группы задаются login.

Если вы хотите установить их самостоятельно, вы будете нуждаться функций getgrouplist() и setgroups() из <grp.h> - обратите внимание, что вы должны быть корень звонить setgroups() успешно.

+0

Обратите внимание, что эти функции - и initgroups() - выходят за рамки стандарта POSIX. Они не все универсальны на всех Unix-подобных платформах; в частности, функция 'getgrouplist()', например, недоступна в Solaris. Кроме того, взломать собственный «getgrouplist()» стоит дорого; вы должны прочитать всю группу «файл» (база данных), потому что файл raw/etc/group не предоставляет структуру «инвертированного индекса», необходимую для ответа на вопрос «какие группы пользователь X принадлежит» более эффективно. –

0
  • Сообщество нескольких групп обычно устанавливается при входе в систему, но не используется. SOP часто состоит в том, чтобы дать каждому пользователю свою собственную группу.

  • Сетевые файловые системы обычно не уважают локальные привилегии локальных клиентов.

1

Спасибо, setgroups() был в значительной степени ответом. Тем не менее, я закончил использование initgroups(), который работал очень хорошо. Вызов был сделан до того, как я сделал setuid подальше от корня.

Нашел на страницах руководства NAME initgroups - инициализировать список доступа дополнительных групп

СИНТАКСИС #include #include

int initgroups(const char *user, gid_t group); 

Видимо, если группы приходят из LDAP, необходимо сделайте это, чтобы правильно заполнить их.