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