15

Я хочу установить разрешения по умолчанию для общего файлового ресурса, чтобы каждый мог rwx всех каталогов и чтобы все вновь созданные файлы были rw .

Все, кто имеет доступ к этой папке, входят в одну группу, так что это не проблема.

Я смотрел на это через ACL без изменения всех пользовательских масок и тому подобного. Вот мои текущие призывы:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

Моя проблема заключается в том , что в то время как я хочу , чтобы все вновь созданные поддиректории быть rwx я хочу только вновь созданные файлы , которые будут rw

У кого-нибудь есть лучший метод для достижения желаемого конечного результата? Есть ли способ установить списки ACL для каталогов отдельно от файлов, аналогично chmod +x или chmod +X?

Спасибо

3 ответа3

12

Как указывает Жиль, разрешения по умолчанию для 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 '{}' ';'
3

Для будущих читателей, чтобы использовать setfacl для существующих файлов / папок без добавления исполняемого бита в ваши файлы, решение - это часть ответа @ Mikel:

Моя версия setfacl позволяет X точно так, как вы хотите, например:

setfacl g:mygroup:rwX

Соответствующая выдержка из документации по setfacl:

Поле perms представляет собой комбинацию символов, которые обозначают разрешения: чтение (r), запись (w), выполнение (x), выполнение только в том случае, если файл является каталогом или уже имеет разрешение на выполнение для некоторого пользователя (X).

2

Насколько я понимаю, Linux ACL, setfacl -Rdm g:mygroup:rwx share_name делает именно то, что вы хотите. Эксперимент:

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

Тогда как другой пользователь в группе mygroup:

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

В чем дело?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

Действующий ACL для mygroup является результатом записи ACL_GROUP для mygroup (rwx) и записи ACL_MASK (rw-).

Справочная страница acl(5) объясняет это в разделе «Алгоритмы проверки доступа». Это не объясняет, как генерируются записи ACL_MASK , но на практике кажется, что все происходит правильно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .