Como conceder leitura / gravação a um usuário específico em qualquer subdiretório existente ou futuro de um determinado diretório?

8

Eu hospedo meu próprio repositório git em um VPS. Digamos que meu usuário seja john.

Estou usando o protocolo ssh para acessar meu repositório git, então minha URL é algo como ssh://[email protected]/path/to/git/myrepo/.

Root é o dono de tudo o que está sob /path/to/git

Estou tentando conceder acesso de leitura / gravação a john para tudo o que está sob /path/to/git/myrepo

Eu tentei os dois chmode setfaclcontrolamos o acesso, mas ambos falham da mesma maneira: eles aplicam direitos recursivamente (com as opções corretas) a todos os subdiretórios existentes do momento /path/to/git/myrepo, mas assim que um novo diretório é criado, meu usuário não pode escrever no novo diretório.

Eu sei que existem ganchos no git que me permitirão reaplicar os direitos após cada confirmação, mas estou começando a pensar que estou indo na direção errada, porque isso parece muito complicado para um propósito muito básico.

P : Como devo configurar o meu direito de conceder ao rw acesso a john para qualquer coisa abaixo /path/to/git/myrepoe torná-lo resistente a alterações na estrutura da árvore?

P2 : Se eu der um passo atrás, mude a abordagem geral, por favor me diga.

Edit : A pergunta foi respondida como está, mas essa foi a pergunta errada. A pergunta certa seria "Como configurar um repositório bare git no servidor para uso com acesso ssh?". Veja minha própria resposta.

Samuel Rossille
fonte

Respostas:

5

crie um grupo, myrepouserspor exemplo, e adicione seus usuários git a esse grupo.

Em seguida, altere o grupo de tudo em / path / para / git / myrepo para myrepousers:

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

Em seguida, corrija as permissões:

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

Deve estar tudo pronto.

Sarja
fonte
2
Se você quiser entender o que está acontecendo aqui, Samuel, pesquise no Google por "setgid". A mágica aqui está no g+s. Claro que você também precisará primeiro entender o básico chmod.
Iconoclast
Eu pensei que tinha entendido como fazer isso com + s no diretório, mas ele não fez o que eu esperava: as permissões não foram transmitidas para novos diretórios. O que significam o último e o terceiro últimos tokens: {} e \ Agradecemos antecipadamente.
Samuel Rossille
{}- é um espaço reservado para substituição de nome de arquivo. ;é o terminador do comando executado por -exec. Como ;tem um significado especial, bashele deve ser escapado com \. veja man findpara detalhes
Serge
4

Na verdade, essa foi a abordagem errada. Após pesquisas adicionais, descobri que, no meu caso, tenho que usar os recursos de compilação do git para lidar com o sistema de arquivos no repositório.

É basicamente feito com a sharedopção de git init, que pode ter (entre outros) os seguintes valores:

  • group: inicialize o repositório para que arquivos e diretórios tenham acesso de gravação de usuário e grupo e todo mundo tenha acesso de leitura
  • 0660: mesmo, mas sem acesso de leitura para os outros.

Os diretórios e arquivos recém-criados automaticamente têm as permissões corretas. Você também pode usar git initem um repositório existente para reconfigurá-lo sem perder seu conteúdo.

Então, no final, o que eu tinha que fazer:

  • Crie um grupo mygitrepo
  • Adicione usuários a ele
  • chmod -R o repositório git para root:mygitrepo

E agora todos os usuários do grupo podem puxar / empurrar, e mais ninguém pode, e isso sem mexer nos direitos do sistema de arquivos.

git init --bare --shared=0660

http://www.kernel.org/pub/software/scm/git/docs/git-init.html para mais informações.

Samuel Rossille
fonte
2

Se houver ACLs suportadas, você poderá fazê-lo com ACLs padrão. Lembre-se de que é fácil esquecer aqueles, pois eles não aparecem quando você faz um ls -l.

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

Mas suspeito que você queira fazer algo um pouco mais organizado. A implantação de gitolita pode fornecer uma solução melhor.

Stéphane Chazelas
fonte
1
Pelo menos com o Debian Wheezy ls(e também acho que o Squeeze), você recebe um +no final das permissões para dizer que há uma ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert
Graças a isso funciona, mas você poderia esclarecer o significado dos dois últimos tokens: {} +
Samuel Rossille 1/12/12
Essa é a find ... -exec cmd {} +sintaxe, na qual {}é substituído o maior número possível de nomes de arquivos encontrados (como oppsed {} \;onde {}é substituído apenas por um arquivo encontrado por vez)
Stéphane Chazelas