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

15

У меня есть определенный каталог, в котором есть проект, который используется несколькими пользователями. Эти пользователи используют 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текущим сеансом достаточно для меня и гораздо проще.

mislav
источник

Ответы:

19

Чтобы все файлы в данном каталоге наследовали права группы, вам нужно использовать бит 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
ℝaphink
источник
Благодарю. Интересно, что я не нашел это,
погуглив
6

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

find /path/to/base/dir -type d -exec chmod g+s {} +
andrewtweber
источник
4

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

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

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

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

git config core.sharedRepository group 

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

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

chgrp -R repogroup .

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

chmod -R g+wX .

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

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

ggll
источник
3

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

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

ThatGraemeGuy
источник