Как указывает Жиль, setfacl
разрешения по умолчанию определяют максимальные разрешения, в основном заменяя umask
. Таким образом, вновь созданные файлы будут существовать, rw
если только приложение, создавшее файл, не запросит его для запуска.
$ 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--
Обратите внимание на эффективную химическую завесу выше. (Есть только несколько программ, которые попросят установить бит выполнения для файлов, которые он создает, например, gcc
для исполняемых файлов, и cp
если копируемый файл был исполняемым.)
Или вы имели в виду, что первая команда setfacl работала так, как вы хотели, а вторая - нет? Другими словами, вы хотите исправить разрешения для старых файлов, убедиться, что каталоги можно обойти, не предоставляя другим обычным файлам разрешения на выполнение?
Моя версия setfacl
позволяет X
именно так, как вы хотите, например:
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
Если ваша версия setfacl
не поддерживает это, почему бы не использовать find
?
перезаписать разрешения, установив для них rw для файлов и rwx для dirs
$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)
установить разрешения ACL mygroup на основе существующих разрешений группы
$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
-o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)
Возможно, вы захотите проверить, что маска группы предоставляет действующие разрешения. Если нет, вам придется запустить это тоже:
$ find . -type d -exec chmod g+rwX '{}' ';'