Como copio ACLs no Mac OS X?


13

A maioria dos derivados unix pode copiar ACLs de um arquivo para outro com:

getfacl filename1 | setfacl -f - filename2

Infelizmente, o Mac OS X não possui os comandos getfacl e setfacl, pois eles transferiram o tratamento da ACL para o chmod. O chmod -E aceita uma lista de ACLs no stdin, mas não encontrei um comando que cuspisse as ACLs em um formato adequado no stdout. O melhor que inventei é:

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

Existe uma solução mais robusta?

Pergunta de bônus: existe uma boa maneira de fazer isso no Python, sem usar nenhum módulo que não seja fornecido com o 10.6?


Portanto, agora é o ano de 2020, e o macOS ainda não tem getfacl/ setfacl. Bastante notável. github.com/jvscode/getfacl tem 10 anos e não consegui fazê-lo funcionar. serverfault.com/a/303752/104173 parece complicado, e não estou claro se ele tenta substituir a get/setfaclfuncionalidade. Entendo que o macOS não é uma plataforma de servidor, mas ainda pode sofrer invasões de segurança. Vale a pena reiniciar esta conversa em apple.stackexchange.com ?
Johnny Utahh

Respostas:


8

ls -e Imprima a lista de controle de acesso (ACL) associada ao arquivo, se presente, na saída longa (-l).

isso dá um resultado como ...

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

Pessoalmente, tenho "exportações" no meu ~/.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"

que tornam isso chmodpossível ...

sudo chmod + a "permitir localadmin $ DIR_ALL" / APPBUNDLE

Na chmodpágina de manual, há essa informação ... que sugere que pode ser realmente possível fazer algo como você descreve.

"As ACLs são manipuladas usando extensões da gramática do modo simbólico. Cada arquivo tem uma ACL, contendo uma lista ordenada de entradas. Cada entrada refere-se a um usuário ou grupo e concede ou nega um conjunto de permissões. Nos casos em que um usuário e um Se o grupo existe com o mesmo nome, o nome do usuário / grupo pode ser prefixado com "usuário:" ou "grupo:" para especificar o tipo de nome ".

chmod -E Lê as informações da ACL do stdin, como uma lista seqüencial de ACEs, separadas por novas linhas. Se as informações analisarem corretamente, as informações existentes serão substituídas.

Além disso, vou gritar para o BatchMod , um veterano , mas um presente para as ACLs e para o TinkerToolSystem .


Isso funcionou para mim, mas tive que alterar o comando chmod para: sudo chmod +a "localadmin allow $DIR_ALL" /APPBUNDLE(alternando o nome do usuário e o allow) #
E. Moffat


1

Talvez dê uma olhada em https://github.com/jvscode/getfacl .


Boa referência. Infelizmente, este projeto parece ter 10 anos, não possui setfacl(apenas getfacl) e a getfaclfuncionalidade parece ser bastante limitada. Infelizmente, não encontrei uma solução melhor.
Johnny Utahh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.