Как мне скопировать ACL на Mac OS X?

13

Большинство производных Unix могут копировать ACL из одного файла в другой с помощью:

getfacl filename1 | setfacl -f - filename2

К сожалению, Mac OS X не имеет команд getfacl и setfacl, поскольку они свернули обработку ACL в chmod. chmod -E принимает список ACL на stdin, но я не нашел команду, которая будет выдавать ACL в подходящем формате на stdout. Лучшее, что я придумал, это:

ls -led filename1 | tail +2 | sed 's/^ *[0-9][0-9]*: *//' | chmod -E filename2

Есть ли более надежное решение?

Дополнительный вопрос: есть ли хороший способ сделать это в Python, без использования каких-либо модулей, которые не поставляются с 10.6?

MagerValp
источник
Итак, сейчас 2020 год, а у macOS нет getfacl/ setfacl. Весьма замечательно. github.com/jvscode/getfacl 10 лет, я не смог заставить его работать. serverfault.com/a/303752/104173 выглядит сложным, и мне не ясно, пытается ли он заменить get/setfaclфункциональность. Я понимаю, что macOS не является серверной платформой, но она все еще может подвергаться вторжениям в систему безопасности. Стоит ли возобновить этот разговор на apple.stackexchange.com ?
Джонни Юта

Ответы:

8

ls -e Распечатайте список контроля доступа (ACL), связанный с файлом, если он есть, в длинном (-l) выводе.

это дает такой результат, как ...

drwxr-xr-x@ 19 localadmin   646B Aug  4 00:21  APPBUNDLE
0: user:localadmin allow add_file,add_subdirectory,writeattr,writeextattr,writesecurity
                   ⬆    ⇧                      ⇶                                     ⬆

Лично у меня "экспорт" в моем ~/.bash_profile

export FILE_ALL="read,write,append,execute,delete,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown"
export DIR_ALL="list,search,add_file,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown"

что делает такое chmodвозможным ...

sudo chmod + a "разрешить localadmin $ DIR_ALL" / APPBUNDLE

Со chmodстраницы руководства есть немного информации ... которая намекает на то, что действительно возможно сделать что-то, как вы описываете ...

«Списки управления доступом обрабатываются с использованием расширений грамматики символьного режима. Каждый файл имеет один список управления доступом, содержащий упорядоченный список записей. Каждая запись относится к пользователю или группе и предоставляет или запрещает набор разрешений. В случаях, когда пользователь и Группа существует с тем же именем, имя пользователя / группы может иметь префикс «user:» или «group:» для определения типа имени. »

chmod -E Считывает информацию ACL из стандартного ввода в виде последовательного списка ACE, разделенных символами новой строки. Если информация анализируется правильно, существующая информация заменяется.

Кроме того, я дам привет BatchMod , старому , но полезному для ACL, а также TinkerToolSystem .

mralexgray
источник
Это сработало для меня, но мне пришлось изменить команду chmod на: sudo chmod +a "localadmin allow $DIR_ALL" /APPBUNDLE(переключение имени пользователя и имени allow)
Э. Моффат
1

Вы должны быть в состоянии statотформатировать его вывод подходящим способом.

Приостановлено до дальнейшего уведомления.
источник
stat не перечисляет ACL.
MagerValp
1

Может быть, посмотрите на https://github.com/jvscode/getfacl .

кругозор
источник
Хорошая ссылка. Увы, этому проекту, похоже, 10 лет, он не имеет setfacl(только getfacl), а getfaclфункциональность кажется довольно ограниченной. Я, к сожалению, не нашел лучшего решения.
Джонни Юта