Назад | Перейти на главную страницу

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

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

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

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

Я не могу найти источник обратно, но использую 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.

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

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

Видеть Вот.