Geben Sie die Standardgruppe und Berechtigungen für neue Dateien in einem bestimmten Verzeichnis an

15

Ich habe ein bestimmtes Verzeichnis, in dem sich ein Projekt befindet, das von mehreren Benutzern geteilt wird. Diese Benutzer verwenden SSH, um Zugriff auf dieses Verzeichnis zu erhalten und Dateien zu ändern / zu erstellen.

Dieses Projekt sollte nur für eine bestimmte Benutzergruppe schreibbar sein: Nennen wir es "Meine Gruppe". Während einer SSH-Sitzung sollten alle vom aktuellen Benutzer erstellten Dateien / Verzeichnisse standardmäßig der Gruppe "mygroup" gehören und über gruppenschreibbare Berechtigungen verfügen.

Ich kann das Berechtigungsproblem lösen mit umask:

$ cd project
$ umask 002
$ touch test.txt

Die Datei "test.txt" kann jetzt in Gruppen geschrieben werden, gehört jedoch weiterhin zu meiner Standardgruppe ("mislav", genau wie mein Benutzername) und nicht zu "mygroup". Ich kann chgrpdie gewünschte Gruppe rekursiv festlegen, aber ich wollte wissen, ob es eine Möglichkeit gibt, eine Gruppe implizit festzulegen, so wie umask die Standardberechtigungen während einer Sitzung ändert.

Dieses spezifische Verzeichnis ist ein freigegebenes Git-Repo mit einer Arbeitskopie, und ich möchte git checkoutund git resetOperationen, um die richtige Maske und Gruppe für neue Dateien in der Arbeitskopie zu setzen. Das Betriebssystem ist Ubuntu Linux.

Update: Ein Kollege schlägt vor, dass ich mich mit getfacl / setfacl von POSIX ACL befassen soll, aber die Lösung unten in Kombination mit umask 002in der aktuellen Sitzung ist gut genug für mich und viel einfacher.

Mislav
quelle

Antworten:

19

Damit alle Dateien in einem bestimmten Verzeichnis Gruppenrechte erben, müssen Sie das setgid-Bit in Ihrem Verzeichnis verwenden. Siehe diesen Link .

 $ 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
ℝaphink
quelle
Vielen Dank. Interessant, dass ich das durch googeln nicht gefunden habe
mislav
6

Wenn Sie dies mit einem vorhandenen Ordner tun möchten, müssen Sie sicherstellen, dass das Bit setgid auch für alle Unterordner aktiviert ist. Sie benötigen es jedoch nicht für Dateien, und Sie möchten es wahrscheinlich auch nicht für Dateien. So legen Sie es rekursiv für alle Unterordner fest.

find /path/to/base/dir -type d -exec chmod g+s {} +
andrewtweber
quelle
4

Ich kann die Quelle nicht zurückfinden, aber setgidich gehe davon aus, dass die Verwendung dieses Problems für Bare-Git-Repositorys, von denen ich annehme, dass es Ihr Fall ist, veraltet ist und in einigen Fällen Probleme verursachen kann.

Git kann das alles über die core.sharedRepositoryFlagge erledigen. Ich hatte das gleiche Problem und löste es wie folgt:

Angenommen, repogroupIhre Gruppe ist und Sie müssen cddas Repo-Verzeichnis:

Ändern Sie zuerst das gemeinsame Flag in group:

git config core.sharedRepository group 

Hinweis: Hier müssen Sie das Schlüsselwort groupund nicht den Gruppennamen verwenden. Dies entspricht dem Erstellen des nackten Repositorys mit der Option --shared=group.

Ändern Sie dann die Gruppe für das gesamte Repository:

chgrp -R repogroup .

Um sicherzustellen, dass vorhandene Verzeichnisse für Gruppen beschreibbar sind ( g+w) und vorhandene ausführbare Dateien auch zu ausführbaren Dateien für Gruppen werden ( g+X), müssen Sie außerdem Folgendes tun:

chmod -R g+wX .

Sobald Sie dies getan haben, erkennt git die shared=groupMarkierung und kümmert sich im Folgenden um die Gruppenberechtigungen, sowohl für vorhandene als auch für neue Dateien, sodass Sie nie wieder umaskoder benötigen chgrp.

Ich werde die Quelle in einen Kommentar einfügen, wenn ich sie wiederfinde.

ggll
quelle
3

Ich bin kein großer Experte, wenn es um die * nix-Seite geht, aber ich denke, was Sie suchen, heißt setgid.

Sehen Sie hier .

ThatGraemeGuy
quelle