Określ domyślną grupę i uprawnienia dla nowych plików w określonym katalogu

15

Mam pewien katalog, w którym jest projekt współdzielony przez wielu użytkowników. Ci użytkownicy używają SSH, aby uzyskać dostęp do tego katalogu i modyfikować / tworzyć pliki.

Ten projekt powinien być możliwy do zapisu tylko dla określonej grupy użytkowników: nazwijmy go „moja grupa”. Podczas sesji SSH wszystkie pliki / katalogi utworzone przez bieżącego użytkownika powinny domyślnie należeć do grupy „moja grupa” i mieć uprawnienia do zapisu w grupie.

Mogę rozwiązać problem uprawnień za pomocą umask:

$ cd project
$ umask 002
$ touch test.txt

Plik „test.txt” można teraz zapisywać w grupach, ale nadal należy do mojej domyślnej grupy („mislav”, tak jak moja nazwa użytkownika), a nie do „mygroup”. Mogę chgrprekurencyjnie ustawić żądaną grupę, ale chciałem wiedzieć, czy istnieje sposób, aby ustawić grupę domyślnie, np. Umask zmienia domyślne uprawnienia podczas sesji.

Ten konkretny katalog jest udostępnionym repozytorium git z kopią roboczą, a ja chcę git checkouti git resetoperacje, aby ustawić poprawną maskę i grupę dla nowych plików utworzonych w kopii roboczej. System operacyjny to Ubuntu Linux.

Aktualizacja: kolega sugeruje, że powinienem przejrzeć getfacl / setfacl POSIX ACL, ale poniższe rozwiązanie w połączeniu z umask 002bieżącą sesją jest dla mnie wystarczające i jest o wiele prostsze.

mislav
źródło

Odpowiedzi:

19

Aby wszystkie pliki w danym katalogu dziedziczyły prawa grupy, musisz użyć bitu setgid w swoim katalogu. Zobacz ten 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
Inkaphink
źródło
Dzięki. Interesujące, że nie znalazłem tego, przeglądając go
mislav
6

Jeśli chcesz to zrobić z istniejącym folderem, musisz upewnić się, że bit setgid jest również włączony dla wszystkich podfolderów. Jednak nie potrzebujesz go w plikach i prawdopodobnie nie chcesz go też w plikach. Oto, jak ustawić rekurencyjnie dla wszystkich podfolderów.

find /path/to/base/dir -type d -exec chmod g+s {} +
andrewtweber
źródło
4

Nie mogę znaleźć źródła z powrotem, ale użycie setgidtego rozwiązania w przypadku repozytoriów git git, które, jak zakładam, jest twoim przypadkiem, jest przestarzałe i może powodować problemy w niektórych przypadkach.

Git może zająć się tym wszystkim za pośrednictwem core.sharedRepositoryflagi. Miałem ten sam problem i rozwiązałem go w następujący sposób:

Zakładając, że repogrouptwoja grupa, i ty maszcd do katalogu repo:

Najpierw zmień flagę współdzieloną na group:

git config core.sharedRepository group 

Uwaga: tutaj musisz użyć słowa kluczowego group, a nie nazwy grupy. Jest to równoważne z utworzeniem pustego repozytorium z opcją --shared=group.

Następnie zmień grupę dla całego repozytorium:

chgrp -R repogroup .

Aby upewnić się, że istniejące katalogi można zapisywać w grupach ( g+w), a istniejące pliki wykonywalne również stają się plikami wykonywalnymi grup ( g+X), należy również:

chmod -R g+wX .

Gdy to zrobisz, git honoruje shared=groupflagę i zajmuje się uprawnieniami grupy w następujących przypadkach, zarówno dla istniejących, jak i nowych plików, więc nigdy więcej nie będziesz potrzebować do umasklub chgrp.

Umieszczę źródło w komentarzu, jeśli go znajdę.

ggll
źródło
3

Nie jestem wielkim ekspertem, jeśli chodzi o stronę * nix, ale myślę, że to, czego szukasz, nazywa się setgid.

Zobacz tutaj .

ThatGraemeGuy
źródło