Укажите группу по умолчанию и разрешения для новых файлов в определенном каталоге

У меня есть определенный каталог, в котором есть проект, который используется несколькими пользователями. Эти пользователи используют SSH для получения доступа к этому каталогу и изменения / создания файлов.

Этот проект должен быть доступен для записи только определенной группе пользователей: давайте назовем его "mygroup". Во время сеанса SSH все файлы / каталоги, созданные текущим пользователем, должны по умолчанию принадлежать группе "mygroup" и иметь права на запись в группу.

Я могу решить проблему с разрешениями umask:

$ cd project
$ umask 002
$ touch test.txt

Файл "test.txt" теперь доступен для записи в группе, но все еще принадлежит моей группе по умолчанию ("mislav", то же самое, что и мое имя пользователя), а не "mygroup". Я могу chgrp рекурсивно установить желаемую группу, но я хотел знать, есть ли способ неявной установки какой-либо группы, например, umask изменяет разрешения по умолчанию во время сеанса.

Этот конкретный каталог является общим репозиторием Git с рабочей копией, и я хочу git checkout а также git reset операции по установке правильной маски и группы для новых файлов, созданных в рабочей копии. ОС - это Ubuntu Linux.

Обновление: коллега предлагает мне посмотреть getfacl/setfacl POSIX ACL, но приведенное ниже решение в сочетании с umask 002 в текущем сеансе это достаточно хорошо для меня и намного проще.

5 ответов

Решение

Чтобы все файлы в данном каталоге наследовали права группы, вам нужно использовать бит setgid в вашем каталоге. Смотрите эту ссылку.

 $ mkdir test
 $ sudo chown raphink.staff test
 $ ls -lhd test
     drwxr-xr-x 2 raphink staff 4.0K 2009-12-21 16:19 test
 $ sudo chmod g+s test # Set the setgid bit
 $ ls -lhd test
     drwxr-sr-x 2 raphink staff 4.0K 2009-12-21 16:21 test
 $ touch test/foo
 $ ls -lh test
     total 0
     -rw-r--r-- 1 raphink staff 0 2009-12-21 16:23 foo

Я не могу найти источник назад, но использую setgid Решить эту проблему для обычных git-репозиториев, что, как я полагаю, в вашем случае, является устаревшим и в некоторых случаях может вызывать проблемы.

Git может позаботиться обо всем этом через core.sharedRepository флаг. У меня была такая же проблема, и я решил ее следующим образом:

Если предположить, repogroup ваша группа, и у вас есть cd в каталог репо:

Сначала измените общий флаг на group:

git config core.sharedRepository group 

Примечание: здесь вы должны использовать ключевое слово group, а не название группы. Это эквивалентно созданию чистого хранилища с опцией --shared=group,

Затем измените группу для всего хранилища:

chgrp -R repogroup .

Чтобы убедиться, что существующие каталоги доступны для записи в группе (g+w) и существующие исполняемые файлы также становятся исполняемыми группами (g+X) вам также необходимо:

chmod -R g+wX .

Как только вы это сделаете, git будет соблюдать shared=group отметьте и позаботьтесь о разрешениях группы в следующем, как для существующих, так и для новых файлов, так что вам больше никогда не понадобится umask или же chgrp,

Я поставлю источник в комментарии, если найду его обратно.

Если вы хотите сделать это с существующей папкой, вам нужно убедиться, что бит setgid включен также для всех подпапок. Тем не менее, вам не нужно это для файлов, и вы, вероятно, не хотите это для файлов тоже. Вот как установить его для всех подпапок рекурсивно.

find /path/to/base/dir -type d -exec chmod g+s {} +

Я не очень разбираюсь в вопросах *nix, но я думаю, что то, что вы ищете, называется setgid.

Смотрите здесь

Трудно наследовать разрешения родительского каталога в Linux/UNIX без использования ACL. но есть способ назначить права доступа к файлу по умолчанию, проверьте ниже ссылку

Можете ли вы наследовать разрешения родительского каталога.

Другие вопросы по тегам