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