У меня есть каталог, который может быть прочитан и записан парой групп unix. Это достигается с помощью ACL. Предположим, я сделал это так:
mkdir /tmp/test
setfacl -d -m g:group1:rwx /tmp/test
Отлично работает, вся группа (и другие группы, которые я добавляю вот так) могут читать / писать в этот каталог. НО есть одно исключение: когда кто-то создает подпапку с помощью mkdir -p
тогда этот каталог создается с разрешениями unix 0755, потому что umask по умолчанию - 022. Это приводит к проблеме, заключающейся в том, что другие пользователи группы больше не могут писать в эту подпапку, потому что теперь ACL выглядит следующим образом:
group:group1:rwx #effective:r-x
По некоторым причинам этого не происходит при использовании «mkdir» (без аргумента -p). Одним из решений является установка umask на 002, но это действительно плохо, потому что это также влияет на файлы и каталоги, созданные вне каталогов, контролируемых ACL, и эти файлы не должны быть доступны для групповой записи по умолчанию.
Поэтому мне интересно, есть ли еще одна возможность решить эту проблему. Было бы идеально иметь возможность полностью отключать / игнорировать старые разрешения в стиле unix для каталога, управляемого ACL. Или отключите этот "эффективный ACL". Это возможно? Или есть другой способ решить проблему с недоступными для записи каталогами, вызванную такими программами, как "mkdir -p"? В конце концов, мне нужен каталог, который полностью (и рекурсивно) доступен для чтения и записи в соответствии с настроенными мной ACL, и это никогда не должно меняться (только путем изменения самих ACL).
Примечание: чтобы воспроизвести проблему:
$ mkdir /tmp/test
$ setfacl -d -m g:group1:rwx /tmp/test
$ umask 0022
$ mkdir /tmp/test/aa
$ mkdir -p /tmp/test/bb
$ ls -log /tmp/test
drwxrwxr-x+ 2 4096 Mar 9 23:38 aa
drwxr-xr-x+ 2 4096 Mar 9 23:38 bb
$ getfacl /tmp/test/bb | grep ^group:group1
group:group1:rwx #effective:r-x
Это ошибка gnu mkdir
: http://savannah.gnu.org/bugs/?19546 Невозможно отключить традиционные разрешения Unix. поскольку mkdir
работает, вы можете написать функцию оболочки, которая переопределяет mkdir
. В функции оболочки найдите -p
в аргументах и запустите серию не-p-using mkdir
s вместо этого.
Многие системы на базе Linux теперь используют umask 0002 с пользовательскими частными группами, поэтому эта проблема не возникает.
Это был баг с GNU mkdir
(# 14371), это было исправлено в coreutils 8.22.
Есть несколько обходных путей.
Обходной путь №1: оболочка (уже предложено Марком Вагнером)
Поскольку mkdir работает, вы можете написать функцию оболочки, которая переопределяет mkdir (или сценарий / usr / local / bin / mkdir, поскольку это обычно перед / bin). Этот сценарий ищет -p в аргументах, а затем рекурсивно вызывает mkdir без «-p».
Обходной путь 2: umask 0002
Если вы можете управлять скриптом, который вызывает mkdir, вы можете установить маску перед вызовом mkdir:
(umask 0002 ; mkdir -p /path/to/dir)
Ваши другие вопросы:
Поэтому мне интересно, есть ли еще одна возможность решить эту проблему. Было бы идеально иметь возможность полностью отключить / игнорировать старые разрешения в стиле unix для каталога, управляемого ACL.
Нет, для совместимости требуется разрешение, также прочтите Почему chmod (1) в группе влияет на маску ACL?
Или отключите этот "эффективный ACL".
Нет
Вы пробовали установить бит setgid в содержащем каталоге? Это должно обеспечить одинаковые разрешения для всех новых файлов и каталогов в нем.