Я знаю, как работает setgid, но не знаю, для чего он разработан, есть ли какой-нибудь пример, чтобы проиллюстрировать, какие проблемы он решает?
Хотя файл / двоичный файл setgid может быть бесполезным, я определенно считаю, что бит setgid очень полезен для каталогов. Предполагая, что вы являетесь частью разных рабочих групп, каждая из которых имеет свои группы unix (разрешений). Наверняка вы затем захотите установить бит setgid в папки проекта, убедившись, что при создании новых файлов применяется право владения группой, и тем самым разрешить вашим коллегам в этой группе проектов доступ к этим файлам?
Основное использование - сохранить группу-владельца дерева файлов:
[lockie@bubbles tmp]$ mkdir dir1 && touch dir1/file && mkdir dir1/dir
[lockie@bubbles tmp]$ mkdir dir2 && chgrp staff dir2 && chmod 2755 dir2 && touch dir2/file && mkdir dir2/dir
[lockie@bubbles tmp]$ ls -al dir1
total 32
drwxrwxr-x 3 lockie lockie 4096 Dec 13 19:32 .
drwxrwxrwt 125 root root 20480 Dec 13 19:32 ..
drwxrwxr-x 2 lockie lockie 4096 Dec 13 19:32 dir
-rw-rw-r-- 1 lockie lockie 0 Dec 13 19:32 file
[lockie@bubbles tmp]$ ls -al dir2
total 32
drwxr-sr-x 3 lockie staff 4096 Dec 13 19:32 .
drwxrwxrwt 125 root root 20480 Dec 13 19:32 ..
drwxrwsr-x 2 lockie staff 4096 Dec 13 19:32 dir < note new dir is g+s, owned by "staff" group, so the setgid behaviour acts recursively
-rw-rw-r-- 1 lockie staff 0 Dec 13 19:32 file < note new file is owned by "staff" group
[lockie@bubbles tmp]$
Это, как правило, полезно в средах, где разные пользователи будут создавать / редактировать файлы / каталоги в каталоге: когда все файлы / каталоги используют одну и ту же группу, все пользователи могут редактировать / изменять файлы / каталоги (разрешения разрешают): это позволяет избежать ситуаций например, «xyz владеет файлом abc, поэтому я не могу его редактировать».
Альтернативой использованию setgid таким образом является grpid опция монтирования файловой системы.
С человека:
grpid или bsdgroups / nogrpid или sysvgroups
Эти параметры определяют, какой идентификатор группы получает вновь созданный файл. Когда установлен grpid, он принимает идентификатор группы каталога, в котором он создан; в противном случае (по умолчанию) он принимает fsgid текущего процесса, если для каталога не установлен бит setgid, и в этом случае он берет gid из родительского каталога, а также получает установленный бит setgid, если это сам каталог.
Если этот параметр включен, файлы / каталоги, созданные в смонтированной файловой системе grpid, также наследуют группу родительского каталога:
[lockie@bubbles ~]$ mount | grep /home
/dev/mapper/VolGroup00-home on /home type ext3 (rw,grpid)
[lockie@bubbles ~]$ mkdir dir3 && touch dir3/file && mkdir dir3/dir
[lockie@bubbles ~]$ ls -al dir3
total 12
drwxrwxr-x 3 lockie users 4096 Dec 13 19:37 .
drwxrwxr-x 12 lockie users 4096 Dec 13 19:37 ..
drwxrwxr-x 2 lockie users 4096 Dec 13 19:37 dir < inherited "users" group from parent dir
-rw-rw-r-- 1 lockie users 0 Dec 13 19:37 file < inherited "users" group from parent dir
[lockie@bubbles ~]$
Я нашел использование grpid опция соответственно снижает вероятность человеческой ошибки (поскольку файловая система выполняет работу независимо от разрешений dir).