Wie kann einem bestimmten Benutzer in einem vorhandenen oder zukünftigen Unterverzeichnis eines bestimmten Verzeichnisses Lese- / Schreibzugriff gewährt werden?

8

Ich hoste mein eigenes Git-Repository auf einem VPS. Angenommen, mein Benutzer ist John.

Ich verwende das SSH-Protokoll, um auf mein Git-Repository zuzugreifen. Meine URL ist also ungefähr so ssh://[email protected]/path/to/git/myrepo/.

Root ist der Besitzer von allem, was darunter ist /path/to/git

Ich versuche, John Lese- / Schreibzugriff auf alles zu gewähren, was darunter steht /path/to/git/myrepo

Ich habe beide versucht chmodund setfaclden Zugriff zu steuern, aber beide schlagen auf die gleiche Weise fehl: Sie wenden Rechte rekursiv (mit den richtigen Optionen) auf alle derzeit vorhandenen Unterverzeichnisse von an /path/to/git/myrepo, aber sobald ein neues Verzeichnis erstellt wird, kann mein Benutzer nicht schreiben im neuen Verzeichnis.

Ich weiß, dass es Hooks in Git gibt, die es mir ermöglichen würden, die Rechte nach jedem Commit erneut anzuwenden, aber ich fange an zu denken, dass ich den falschen Weg gehe, weil dies für einen sehr grundlegenden Zweck zu kompliziert erscheint.

F : Wie sollte ich mein Recht einrichten, John Zugang zu John zu gewähren /path/to/git/myrepound es widerstandsfähig gegen Änderungen der Baumstruktur zu machen?

F2 : Wenn ich einen Schritt zurücktreten sollte, um den allgemeinen Ansatz zu ändern, sagen Sie es mir bitte.

Bearbeiten : Die Frage wurde so wie sie ist beantwortet, aber das war die falsche Frage. Die richtige Frage wäre gewesen: "Wie konfiguriere ich ein Bare-Git-Repository auf dem Server für die Verwendung mit SSH-Zugriff?". Siehe meine eigene Antwort.

Samuel Rossille
quelle

Antworten:

5

Erstellen Sie beispielsweise eine Gruppe myrepousersund fügen Sie Ihre Git-Benutzer dieser Gruppe hinzu.

Ändern Sie dann die Gruppe von allem unter / path / to / git / myrepo in myrepousers:

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

Korrigieren Sie dann die Berechtigungen:

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

Sollte alles eingestellt sein.

Serge
quelle
2
Wenn Sie verstehen wollen, was hier los ist, Samuel, Google für "setgid". Die Magie hier ist in der g+s. Natürlich müssen Sie zuerst auch die Grundlagen von verstehen chmod.
Bilderstürmer
Ich dachte, ich hätte verstanden, wie man das mit + s im Verzeichnis macht, aber es hat nicht das getan, was ich erwartet hatte: Berechtigungen wurden nicht in neue Verzeichnisse übertragen. Was bedeuten die letzten und drittletzten Token: {} und \ Vielen Dank im Voraus.
Samuel Rossille
{}- ist ein Platzhalter für die Ersetzung von Dateinamen. ;ist der Terminator des Befehls, der von ausgeführt wird -exec. Da es ;eine besondere Bedeutung bashhat, muss es mit \ maskiert werden. siehe man findfür Details
Serge
4

Eigentlich war das der falsche Ansatz. Nach zusätzlichen Nachforschungen stellte ich fest, dass ich in meinem Fall die integrierten Funktionen von git verwenden muss, um das Dateisystem direkt im Repository zu verwalten.

Dies geschieht grundsätzlich mit der sharedOption git init, die (unter anderem) folgende Werte haben kann:

  • group: Initialisieren Sie das Repository so, dass Dateien und Verzeichnisse Benutzer- und Gruppenschreibzugriff haben und alle anderen Lesezugriff haben
  • 0660: gleich, aber ohne Lesezugriff für die anderen.

Die neu erstellten Verzeichnisse und Dateien verfügen automatisch über die richtigen Berechtigungen. Sie können git initein vorhandenes Repository auch verwenden, um es neu zu konfigurieren, ohne den Inhalt zu verlieren.

Also am Ende was ich tun musste:

  • Erstellen Sie eine Gruppe mygitrepo
  • Fügen Sie Benutzer hinzu
  • chmod -R das Git-Repository an root:mygitrepo

Und jetzt kann jeder Benutzer der Gruppe ziehen / pushen, und niemand anderes kann, und das ohne die Rechte des Dateisystems zu beeinträchtigen.

git init --bare --shared=0660

Weitere Informationen finden Sie unter http://www.kernel.org/pub/software/scm/git/docs/git-init.html .

Samuel Rossille
quelle
2

Wenn ACLs unterstützt werden, können Sie dies mit Standard-ACLs tun. Beachten Sie, dass es leicht ist, diese zu vergessen, da sie nicht auftauchen, wenn Sie eine machen ls -l.

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

Aber ich vermute, Sie möchten vielleicht etwas besser organisiert sein. Der Einsatz von Gitolite bietet möglicherweise eine bessere Lösung.

Stéphane Chazelas
quelle
1
Zumindest bei Debian Wheezy ls(und ich denke auch bei Squeeze) erhalten Sie +am Ende der Berechtigung eine Berechtigung zu sagen, dass es eine ACL gibt:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert
Vielen Dank, dass dies funktioniert, aber können Sie bitte die Bedeutung der beiden letzten Token klären: {} +
Samuel Rossille
Das ist die find ... -exec cmd {} +Syntax, {}bei der so viele gefundene Dateinamen wie möglich ersetzt werden (im Gegensatz dazu, {} \;bei der jeweils {}nur eine gefundene Datei ersetzt wird)
Stéphane Chazelas