Jak ustawić rekursywnie uprawnienia do katalogu (z włączoną funkcją ACL)?

24

Na przykład chcę dać moim kolegom dostęp do zapisu do określonego katalogu. Załóżmy, że podkatalogi miały prawa dostępu 775, pliki 664, a także, że w katalogu dir - 775 były pliki wykonywalne.

Teraz chcę dodać uprawnienia do zapisu. Z chmod mogłem spróbować czegoś takiego

chmod o+w -R mydir/

Ale to nie jest fajne, ponieważ nie chcę, aby dir był zapisywany w świecie - chcę dać dostęp tylko niektórym użytkownikom, więc chcę korzystać z ACL. Ale czy istnieje prosty sposób na ustawienie tych uprawnień? Widzę, że muszę osobno rozwiązać co najmniej trzy przypadki (katalogi, pliki, pliki wykonywalne):

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

Wydaje się, że jest tak dużo wierszy kodu dla tak prostego zadania. Czy jest lepszy sposób?

Rogach
źródło

Odpowiedzi:

40

setfaclma opcję rekurencyjną ( -R) tak jak chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

pozwala również na korzystanie z uprawnień typu kapitał-x X, co oznacza:

  execute only if the file is a directory or already has
  execute permission for some user (X)

więc wykonanie następujących czynności powinno działać:

setfacl -R -m u:colleague:rwX .

(wszystkie cytaty pochodzą man setfaclz ACL 2.2.52 jak dostarczane z Debianem)

umläute
źródło
4
setfacl nie ma flagi „-R” we FreeBSD 9
Aaron C. de Bruyn
6
to dobrze, że OP oznaczył swoje pytanie jako [linux]
umläute
Przegapiłem to. ;)
Aaron C. de Bruyn
Czy dotyczy to automatycznie nowych plików / folderów utworzonych później?
Enigma,
Sprawdź stronę podręcznika man dla swojej wersji setfacl. Opcja -Xnie działa zgodnie z oczekiwaniami zawartymi w setfacl 2.2.49.
phyatt,
5

Jak wspomniał Umläute, można użyć polecenia setfacl -Rz dużymi literami „X”, na przykład:

setfacl -R -m u:colleague:rwX .

Jednak dla tych, którzy muszą ponownie zastosować ACL w sposób rekultywacyjny (np. „Ponownie zastosuj uprawnienia do podkatalogów” à la Windows).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

To polecenie można podzielić, aby uniknąć błędu setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

Zauważ, że składnia <( something )to Process Substitution , która jest specyficzna dla bash. Może być konieczne utworzenie pliku tymczasowego, jeśli używasz innej powłoki.

Franklin Piat
źródło
0
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done
Shgurbanov
źródło
@muru Z ciekawości, dlaczego nie?
Shadur
Cały komentarz jest linkiem. Postępuj zgodnie z nim i dowiedz się.
muru
Jeśli chcesz skorzystać z tego podejścia, skorzystajfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz,
1
Nie używaj tego. $(find /data -mindepth 0 -type d)nie zwróci wyników linia po linii, buforuje wszystkie wyniki. Jeśli w linii jest spacja, otrzymasz niepoprawny zapis$i zmiennej.
Gnought