Как предоставить чтение / запись конкретному пользователю в любом существующем или будущем подкаталоге данного каталога?

8

Я размещаю свой собственный репозиторий git на VPS. Допустим, мой пользователь Джон.

Я использую протокол ssh для доступа к своему репозиторию git, поэтому мой URL-адрес что-то вроде ssh://john@myserver.com/path/to/git/myrepo/.

Root является владельцем всего, что находится под /path/to/git

Я пытаюсь дать Джону доступ на чтение / запись ко всему, что находится под /path/to/git/myrepo

Я пытался как chmodи setfaclдля контроля доступа, но и не в состоянии точно так же: они применяются права рекурсивно (с нужными опциями) для всех текущих существующих подкаталогов из /path/to/git/myrepo, но как только будет создан новый каталог, мой пользователь не может написать в новом каталоге.

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

В : Как мне установить свое право на доступ к Джону для любого пользователя /path/to/git/myrepoи сделать его устойчивым к изменениям древовидной структуры?

Q2 : Если я должен сделать шаг назад, изменить общий подход, пожалуйста, скажите мне.

Изменить : На вопрос был дан ответ как есть, но это был неправильный вопрос. Правильный вопрос был бы «Как настроить пустой git-репозиторий на сервере для использования с ssh-доступом?». Смотрите мой собственный ответ.

Сэмюэл Россиль
источник

Ответы:

5

myrepousersнапример, создайте группу и добавьте пользователей git в эту группу.

Затем измените группу всего в / path / на / git / myrepo на myrepousers:

chown -R .myrepousers /path/to/git/myrepo

Затем исправьте разрешения:

chmod -R g+w /path/to/git/myrepo
find /path/to/git/myrepo -type d -exec chmod -R {} g+s \;

Должно быть все готово.

саржа
источник
2
Если вы хотите понять, что здесь происходит, Сэмюэл, Google для "setgid". Волшебство здесь в g+s. Конечно, вы должны сначала понять основы chmodтоже.
иконоборчество
Я думал, что понял, как сделать это с + s в каталоге, но он не сделал то, что я ожидал: разрешения не были переданы в новые каталоги. Что означают последние и третьи последние токены: {} и \ Спасибо заранее.
Самуэль Россиль
{}- это заполнитель для замены имени файла. ;является терминатором команды, выполняемой -exec. Как ;имеет особое значение в bashэтом должно быть экранировано с \. см man findподробности
Serge
4

На самом деле это был неправильный подход. После дополнительных исследований я обнаружил, что в моем случае я должен использовать встроенные функции git для управления правами файловой системы в хранилище.

В основном это делается с помощью sharedопции git init, которая может иметь (среди прочего) следующие значения:

  • group: инициализировать репозиторий, чтобы у файлов и каталогов были права на запись для пользователей и групп, а для всех остальных - права на чтение
  • 0660: то же самое, но без доступа для чтения для других.

Вновь созданные каталоги и файлы автоматически имеют необходимые разрешения. Вы также можете использовать git initсуществующий репозиторий, чтобы перенастроить его без потери его содержимого.

Итак, в конце концов, что я должен был сделать:

  • Создать группу mygitrepo
  • Добавить пользователей к нему
  • chmod -R репозиторий git для root:mygitrepo

И теперь каждый пользователь группы может тянуть / толкать, а никто другой не может, и это без суеты с правами файловой системы.

git init --bare --shared=0660

http://www.kernel.org/pub/software/scm/git/docs/git-init.html для получения дополнительной информации.

Сэмюэл Россиль
источник
2

Если ACL поддерживаются, вы можете сделать это с ACL по умолчанию. Помните, что о них легко забыть, так как они не появляются, когда вы делаете ls -l.

find /path/to/git/myrepo -type d -exec setfacl -m d:u:john:rwx {} +

Но я подозреваю, что вы можете сделать что-то более организованное. Развертывание гитолита может обеспечить лучшее решение.

Стефан Шазелас
источник
1
По крайней мере, с Debian Wheezy ls(и я думаю, что Squeeze) вы получаете +в конце разрешения, чтобы сказать, что есть ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert
Спасибо, это работает, но не могли бы вы уточнить значение двух последних жетонов: {} +
Сэмюэль Россиль
Это find ... -exec cmd {} +синтаксис, где {}заменяется как можно больше найденных имен файлов (в отличие от того, {} \;где {}заменяется только один найденный файл за один раз)
Стефан Шазелас