Come concedere la lettura / scrittura a un utente specifico in qualsiasi sottodirectory esistente o futura di una determinata directory?


8

Ospito il mio repository git su un VPS. Diciamo che il mio utente è john.

Sto usando il protocollo ssh per accedere al mio repository git, quindi il mio URL è qualcosa di simile ssh://john@myserver.com/path/to/git/myrepo/.

Root è il proprietario di tutto ciò che è sotto /path/to/git

Sto tentando di dare accesso in lettura / scrittura a john a tutto ciò che è sotto /path/to/git/myrepo

Ho provato sia chmode setfaclal controllo degli accessi, ma entrambi non riuscire allo stesso modo: si applicano i diritti in modo ricorsivo (con le giuste opzioni) a tutte le attuali sottodirectory esistenti di /path/to/git/myrepo, ma non appena viene creata una nuova directory, il mio utente non può scrivere nella nuova directory.

So che ci sono hook in git che mi permetterebbero di riapplicare i diritti dopo ogni commit, ma sto iniziando a pensare che sto andando nella direzione sbagliata perché questo sembra troppo complicato per uno scopo molto basilare.

Q : Come devo impostare il mio diritto di dare a rw l'accesso a john a qualsiasi cosa sotto /path/to/git/myrepoe renderlo resistente al cambiamento della struttura ad albero?

D2 : Se dovessi fare un passo indietro, cambiare l'approccio generale, per favore dimmelo.

Modifica : alla domanda è stata data una risposta così com'è, ma quella era la domanda sbagliata. La domanda giusta sarebbe stata "Come configurare un repository bare git sul server per l'uso con accesso ssh?". Vedi la mia risposta.

Risposte:


5

creare un gruppo, myrepousersad esempio, e aggiungere gli utenti git a quel gruppo.

Quindi cambia il gruppo di tutto in / path / in / git / myrepo in myrepousers:

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

Quindi correggere le autorizzazioni:

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

Dovrebbe essere tutto pronto.


2
Se vuoi capire cosa sta succedendo qui Samuel, Google per "setgid". La magia qui è nel g+s. Ovviamente dovrai prima capire anche le basi di chmod.
iconoclasta,

Pensavo di aver capito come farlo con + s nella directory ma non ha fatto quello che mi aspettavo: i permessi non venivano trasmessi a nuove directory. Cosa significano l'ultimo e il terzo token ultimo: {} e \ Grazie in anticipo.
Samuel Rossille,

{}- è un segnaposto per la sostituzione del nome file. ;è il terminatore del comando eseguito da -exec. Come ;ha un significato speciale in bashesso deve essere evitato con \. vedere man findper i dettagli
Serge

4

In realtà quello era l'approccio sbagliato. Dopo ulteriori ricerche, ho scoperto che nel mio caso devo utilizzare le funzionalità di build di git per gestire il diritto del filesystem nel repository.

Fondamentalmente è fatto con l' sharedopzione di git init, che può avere (tra gli altri) i seguenti valori:

  • group: inizializza il repository in modo che file e directory abbiano accesso in scrittura a utenti e gruppi e tutti gli altri abbiano accesso in lettura
  • 0660: uguale ma senza accesso in lettura per gli altri.

Le directory e i file appena creati hanno automaticamente le autorizzazioni giuste. Puoi anche usaregit init su un repository esistente per riconfigurarlo senza perdere il suo contenuto.

Quindi alla fine quello che dovevo fare:

  • Crea un gruppo mygitrepo
  • Aggiungi utenti ad esso
  • chmod -R il repository git in root:mygitrepo

E ora tutti gli utenti del gruppo possono tirare / spingere, e nessun altro può farlo, e questo senza fare confusione con i diritti del file system.

git init --bare --shared=0660

http://www.kernel.org/pub/software/scm/git/docs/git-init.html per ulteriori informazioni.


2

Se gli ACL sono supportati, puoi farlo con gli ACL predefiniti. Fai attenzione che è facile dimenticarsene perché non si presentano quando lo fai ls -l.

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

Ma sospetto che potresti voler fare qualcosa di un po 'più organizzato. La distribuzione di gitolite può fornire una soluzione migliore.


1
Almeno con Debian Wheezy ls(e penso anche a Squeeze) si ottiene un +alla fine delle autorizzazioni per dire che c'è un ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert,

Grazie, funziona, ma potresti chiarire il significato dei due ultimi token: {} +
Samuel Rossille,

Questa è find ... -exec cmd {} +sintassi, dove {}viene sostituito con il maggior numero possibile di nomi di file trovati (al contrario di {} \;dove {}viene sostituito solo con un file trovato alla volta)
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.