Как использовать chmod на Mac, чтобы новые файлы наследуют разрешения родительского каталога?

На МакОС . Я хочу сделать так, чтобы любые новые файлы/папки, создаваемые в определенной папке, имели те же разрешения ( а не группу , о которых уже позаботились), как и права родительского каталога.

В Linux я бы обычно использовал setfacl, но похоже, что chmodв MacOS можно делать то, что я ищу. Я прочитал manстраницу, chmodно до сих пор не могу понять, как правильно отформатировать команду, чтобы получить то, что я хочу.

Ответы (5)

Во-первых, немного предыстории, чтобы объяснить, что происходит: файлы в OS X могут иметь два совершенно разных типа настроек разрешений, применяемых к ним: POSIX и ACL.

К файлам всегда (ну, почти всегда) применяются разрешения POSIX, состоящие из владельца, группы и других (с некоторой комбинацией чтения, записи и выполнения для каждого из них). Невозможно контролировать наследование разрешений POSIX: новые элементы всегда принадлежат тому пользователю, который их создал, групповое назначение наследуется от папки, в которой они находятся, а доступ определяется umask (что почти всегда: владелец получает полный доступ, группа и другие только чтение + выполнение для папок). Таким образом, разрешения POSIX не будут работать для того, что вы пытаетесь сделать.

К файлам также может применяться список управления доступом (ACL). Это список записей управления доступом (ACE), каждая из которых относится к пользователю или группе, определяет типы доступа (подробно), разрешены они или запрещены, а также следует ли копировать ACE в элементы, созданные внутри папки. Эта последняя часть — та часть, которая делает это полезным для вас; вам нужно создать ACE для папки, в которой указаны нужная группа, типы доступа, которые вы хотите, и полное наследование.

chmodв OS X можно манипулировать ACE с параметрами разрешений +a, -a, и т.д. Если я понимаю, что вы хотите, вы должны использовать это (с заменой имени вашей группы и пути к папке) для создания ACE:

chmod +a "group:examplegroup allow list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit" /path/to/folder

Примечание : наследование не является «живым», т.е.:

  • это не относится к элементам, созданным до того, как вы назначили ACE
  • это не относится к элементам, созданным в другом месте, а затем перемещенным в папку.

Вы можете применить его к существующему содержимому, используя -R(т.е.: chmod -R +a ...). Я не знаю способа (кроме инструментов администрирования сервера Apple) принудительно наследовать элементы, перемещенные в папку.

Спасибо за отличное объяснение. Я только что попробовал это, и он все равно просто создал новый файл с правами на чтение/запись пользователя, все остальные имеют права на чтение. Для родительской папки (на открытом воздухе) установлено разрешение 775, мой пользователь (jhicks) является владельцем, а _www — группой. Я добавил себя в группу _www. drwxrwxr-x+ 13 jhicks _www 442B 16 ноября 09:47 на открытом воздухе Я выполнил вашу команду следующим образом: chmod +a "группа:_www список разрешений, добавить_файл,поиск,добавить_подкаталог,удалить_дочерний,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit, directory_inherit" на открытом воздухе
ls -lпоказывает только разрешения POSIX (хотя «+» после разрешений указывает на наличие ACL). Используйте ls -leтакже для отображения ACL.
Если в имени группы есть пробел, вы можете использовать : в качестве разделителя. Например, "группа:моя группа с пробелом:разрешить"
Выполнив chmod +a ...команду, я создал в папке файл abc.txt . Переключился на другого пользователя и отредактировал с помощью TextEdit, файл указан как заблокированный и не редактируемый.
Я немного поиграл с этим, я думаю, что вы форсируете наследование с помощью +ai

Попробуйте добавить -Rк команде @gordon, например:

chmod -R +a "group:_www allow list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit" outdoors

Опция -Rбудет (как указано здесь ):

Recurse: измените режим файловых иерархий, основанных на файлах, а не только на самих файлах.

Изменение иерархии файлов, кажется, то, что вы ищете (для новых файлов, каталогов и т. д.).

Вы также можете ознакомиться с этой публикацией Apple.SE , в которой описана ситуация, несколько похожая на вашу (за исключением общего каталога), которая требовала sudoприкрепления на передний план.

Это (-R) не то, к чему стремится большинство людей; в большинстве случаев они предпочли бы изменить ACL в самом верхнем каталоге и сделать что-то волшебное, чтобы заставить все содержащиеся объекты наследовать флаги в соответствии с ACL, который они указали в корне этого поддерева. Это намного элегантнее, так как ACL для объектов сортируют эти унаследованные ACE в соответствии с политикой.

И да, для этого мне пришлось написать скрипт на питоне, я тоже ничего подходящего не нашел.

Не хотите ли поделиться (например, по сути ? Если вы не возражаете, я думаю, что это был хороший жест.

На Mac попробуйте использовать PathFinder , это упрощает настройку ACL и POSIX. Если вы размещаете WordPress на Mac Server, вам также необходимо установить define('FS_METHOD', 'direct');в wp-config.php, чтобы установка плагинов и обновление не запрашивали у вас данные FTP.

Таким образом, в основном вы сохраняете разрешения POSIX по умолчанию и добавляете пользователя _www (не группу) в ACL, затем нажимаете «Распространить разрешение» в окне ACL.

chmod +ai, i = наследовать правила ACL