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

23

Я на Mac. Я хочу сделать так, чтобы любые новые файлы / папки, создаваемые в определенной папке, имели те же разрешения (а не группы, о которых уже позаботились), как и у родительского каталога. В Linux я обычно использовал бы setfacl, но похоже, что chmod на Mac может сделать то, что я ищу. Я прочитал справочную страницу для chmod, но все еще не могу понять, как правильно отформатировать команду, чтобы получить то, что я хочу.

Джереми Хикс
источник
Я хочу, чтобы новые файлы / папки были доступны для чтения и записи в группе.

Ответы:

33

Во-первых, немного предыстории, чтобы объяснить, что происходит: к файлам в 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 список разрешений, add_file, поиск, add_subdirectory, delete_child, readattr, writeattr, readextattr, writeextattr, безопасность чтения, file_in directory_inherit "на открытом воздухе
Джереми Хикс
ls -lпоказывает только разрешения POSIX (хотя «+» после разрешений указывает на наличие ACL). Используйте ls -leдля отображения ACL, а также.
Гордон Дэвиссон
Если в имени группы есть пробел, вы можете использовать: в качестве разделителя. Например, «группа: моя группа с пробелом: разрешить»
Дуг Ричардсон
Следовал chmod +a ...команде, затем я создал abc.txt в папке. Переключившись на другого пользователя и отредактировав его с помощью TextEdit, файл обозначен как заблокированный и недоступен для редактирования.
Охо
Я немного поигрался с этим, я думаю, что вы принудительно наследуете с + ai
Робин
4

Попробуйте добавить -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прикрепления к передней части.

JW8
источник
4

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

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

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

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

zaonline
источник
0

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

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

Максимум
источник