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?

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)


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.


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


@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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.