Comment copier des ACL sur Mac OS X?

13

La plupart des dérivés Unix peuvent copier des ACL d'un fichier à un autre avec:

getfacl filename1 | setfacl -f - filename2

Malheureusement, Mac OS X n'a ​​pas les commandes getfacl et setfacl, car elles ont intégré la gestion des ACL dans chmod. chmod -E accepte une liste d'ACL sur stdin, mais je n'ai pas trouvé de commande qui crachera des ACL dans un format approprié sur stdout. Le meilleur que j'ai trouvé est:

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

Existe-t-il une solution plus robuste?

Question bonus: existe-t-il une bonne façon de le faire en Python, sans utiliser de modules qui ne sont pas livrés avec 10.6?

MagerValp
la source
C'est donc maintenant l'année 2020, et macOS n'a toujours pas de getfacl/ setfacl. Assez remarquable. github.com/jvscode/getfacl a 10 ans je n'ai pas pu le faire fonctionner. serverfault.com/a/303752/104173 semble compliqué, et je ne sais pas s'il tente de remplacer la get/setfaclfonctionnalité. Je comprends que macOS n'est pas une plate-forme de serveur, mais il peut toujours subir des intrusions de sécurité. Vaut-il la peine de relancer cette conversation sur apple.stackexchange.com ?
Johnny Utahh

Réponses:

8

ls -e Imprimez la liste de contrôle d'accès (ACL) associée au fichier, le cas échéant, en sortie longue (-l).

cela donne un résultat tel que ...

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

Personnellement, j’ai des «exportations» dans mon ~/.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"

qui rendent un tel chmodpossible ...

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

À partir de la chmodpage de manuel, il y a ce morceau d'informations ... qui laisse entendre qu'il peut en effet être possible de faire quelque chose comme vous décrivez ..

"Les ACL sont manipulées à l'aide d'extensions de la grammaire du mode symbolique. Chaque fichier possède un ACL, contenant une liste ordonnée d'entrées. Chaque entrée fait référence à un utilisateur ou à un groupe et accorde ou refuse un ensemble d'autorisations. Dans les cas où un utilisateur et un groupe existe sous le même nom, le nom de l'utilisateur / groupe peut être préfixé par "utilisateur:" ou "groupe:" afin de spécifier le type de nom. "

chmod -E Lit les informations ACL depuis stdin, sous la forme d'une liste séquentielle d'ACE, séparés par des retours à la ligne. Si les informations sont correctement analysées, les informations existantes sont remplacées.

Aussi, je vais donner un coup de pouce à BatchMod , un ancien, mais un goodie pour les ACL, ainsi que TinkerToolSystem .

mralexgray
la source
Cela a fonctionné pour moi, mais j'ai dû changer la commande chmod pour: sudo chmod +a "localadmin allow $DIR_ALL" /APPBUNDLE(changer le nom d'utilisateur et le allow)
E. Moffat
1

Vous devriez pouvoir statformater sa sortie de manière appropriée.

En pause jusqu'à nouvel ordre.
la source
stat ne répertorie pas les ACL.
MagerValp
1

Jetez peut-être un œil à https://github.com/jvscode/getfacl .

ken
la source
Bonne référence. Hélas, ce projet semble avoir 10 ans, n'a pas setfacl(seulement getfacl), et la getfaclfonctionnalité semble être assez limitée. Je n'ai malheureusement pas trouvé de meilleure solution.
Johnny Utahh