Jak Gilles zdůrazňuje, setfacl
výchozí oprávnění určují maximální oprávnění a v podstatě nahrazují umask
. Nově vytvořené soubory tedy budou mít rw
pokud aplikace, která soubor vytvořila, o to speciálně nepožádala, aby byl spustitelný.
$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--
$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x #effective:r--
group:mygroup:rwx #effective:rw-
mask::rw-
other::r--
Všimněte si výše uvedených účinných povolení. (Existuje jen několik programů, které budou žádat o nastavení bitu spuštění u souborů, které vytvoří, např. gcc
pro spustitelné soubory a cp
pokud byl kopírovaný soubor spustitelný.)
Nebo jsi chtěl říct, že první příkaz setfacl fungoval tak, jak jsi chtěl, ale druhý ne? Jinými slovy, chcete opravit oprávnění ke starým souborům a zajistit, aby bylo možné procházet adresáře, aniž byste udělovali jiným běžným souborům oprávnění ke spuštění?
Moje verze setfacl
umožňuje X
přesně tak, jak chcete, např.:
setfacl g:mygroup:rwX
$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513 4 drwxr-xr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-r--r-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxr-xr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513 4 drwxrwxr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-rwxr-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxrwxr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513 4 drwxrwxr-x 3 myuser myuser 4096 Dec 22 01:56 test
107539 0 -rw-rw-r-- 1 myuser myuser 0 Dec 22 01:56 test/oldfile
107529 4 drwxrwxr-x 2 myuser myuser 4096 Dec 22 01:56 test/olddir
Pokud je vaše verze setfacl
to nepodporuje, proč nepoužít find
?
přepsat oprávnění a nastavit je na rw pro soubory a rwx pro adresáře
$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)
nastavte oprávnění mygroup ACL na základě stávajících skupinových oprávnění
$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)
Pravděpodobně budete chtít zkontrolovat, zda maska skupiny poskytuje účinná oprávnění. Pokud ne, budete muset spustit také toto:
$ find . -type d -exec chmod g+rwX '{}' ';'
Pro budoucí čtenáře použijte setfacl
na existující soubory/složky bez přidání spustitelného bitu do vašich souborů, řešením je tato část odpovědi @Mikel:
Moje verze setfacl umožňuje X přesně tak, jak chcete, např.:
setfacl g:mygroup:rwX
Příslušný výňatek z setfacl
dokumentace:
Pole perms je kombinací znaků, které označují oprávnění:číst (r), zapisovat (w), spouštět (x), spouštět pouze v případě, že soubor je adresář nebo již má oprávnění ke spuštění pro některého uživatele (X) .
Pokud rozumím linuxovým ACL, setfacl -Rdm g:mygroup:rwx share_name
dělá přesně to, co chcete. Experiment:
umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec
Poté jako jiný uživatel ve skupině mygroup
:
$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec
Co se děje?
$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx #effective:rw-
mask::rw-
other::---
Efektivní ACL pro mygroup
je výsledkem and'ing ACL_GROUP
záznam pro mygroup
(rwx
) se záznamem ACL_MASK (rw-
).
Manuálová stránka acl(5) vysvětluje tento výpočet v části „Algoritmy kontroly přístupu“. Nevysvětluje, jak ACL_MASK
záznamy jsou generovány, ale v praxi se zdá, že se děje správná věc.