Unix: existe-t-il un moyen de «copier» les autorisations de fichier ou de répertoire?

14

J'ai deux fichiers dans un répertoire. L'un a les autorisations correctes et l'autre non. Existe-t-il un moyen de «copier» l'ensemble des autorisations d'un fichier à un autre?

Svish
la source

Réponses:

15

La version GNU de l' utilitaire chmod peut copier le mode d'un fichier ( RFile) vers un autre ( file).

chmod --reference=RFile file

GNU coreutils se trouve dans la plupart des distributions Linux et Cygwin, entre autres. Toutes les implémentations chmod ne proposent pas cette option.

Jeremy L
la source
Hm ... on dirait que cela est censé fonctionner, mais pas pris en charge sur Mac OS X? Là , j'obtenir seule option illégale ...
Svish
2
chmod n'est pas une commande bash intégrée. c'est un utilitaire séparé disponible sur de nombreux Unix. l' --referenceoption est incluse dans la version GNU; OSX utilise probablement un chmod qui provient de BSD à la place. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
Quack Quichotte
Svish, vous pourriez envisager d'installer les versions GNU via MacPorts.
Jeremy L
Juste pensé qu'il serait utile de mentionner ici que la cp -dpR <source-file> <dest-file>volonté, lors de la copie d' un fichier, copie des autorisations ainsi que le file.r
LawrenceC
1

Je suis venu avec ceci:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

Ce n'est pas totalement à l'épreuve des balles, mais fait ce dont j'ai besoin.

Ikem Krueger
la source
0

essaye ça:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

cela remonterait récursivement et chmoder chaque fichier, si deux répertoires ne correspondent pas aux fichiers, vous verrez beaucoup d'erreur "Aucun fichier ou répertoire".

bersam
la source
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez
chmod: échec d'obtention des attributs de '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1': aucun fichier ou répertoire de ce type chmod: échec d'obtention des attributs de '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt ': Aucun fichier ou répertoire de ce type chmod: impossible d'obtenir les attributs de' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt ': Non tel fichier ou répertoire chmod: échec d'obtention des attributs de '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt': Aucun fichier ou répertoire de ce type
Rick Sanchez
testé sur 2 dossiers: test1 et test2. chacun a les mêmes fichiers 111/222 / 333.txt avec des autorisations différentes. test1 a les paramètres par défaut. test2 dispose de 777 autorisations. c'est l'erreur que j'obtiens.
Rick Sanchez
0

Vous pouvez utiliser getfaclpour récupérer la liste complète des autorisations de fichiers, du propriétaire, du groupe et des ACL supplémentaires (listes de contrôle d'accès).

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

Si vous enregistrez cette sortie dans un fichier (par exemple acl.txt), vous pouvez ensuite restaurer à partir de ce format avec setfacl --restore acl.txt. Si vous ne souhaitez restaurer qu'un seul fichier et que ce fichier a un nom de fichier différent de l'original, vous voudrez utiliser setfacl --set-file acl.txt filename.txt(où filename.txtest le nouveau nom de fichier).

Pas

  1. Enregistrez les autorisations d'origine dans acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. Écraser les autorisations (pour la démonstration; c'est juste pour que vous puissiez voir que la restauration à l'étape suivante fonctionne)

    $ chmod 777 filename.txt
    $ sudo chown nobody:root filename.txt
    $ ls -l filename.txt
    -rwxrwxrwx 1 nobody root 0 Jan  8 14:24 filename.txt
    
  3. Utilisez setfaclpour restaurer les autorisations correctes à partir de acl.txt:

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

Le nom de fichier provient du # file:commentaire généré par getfacl, il n'est donc pas nécessaire de le spécifier sur la ligne de commande.

Si vous souhaitez restaurer ces autorisations dans un fichier différent, vous pouvez utiliser --set-fileplutôt que --restorecomme ceci:

$ setfacl --set-file acl.txt second_filename.txt

Exemple

Si vous finissez par remplacer les autorisations sur certains fichiers /usr, mais que vous ne savez pas quels fichiers vous avez écrasés, vous pouvez généralement le corriger en restaurant à partir d'un autre système configuré de manière similaire.

  1. Autorisations de sauvegarde à partir du système de travail (remarque: getfaclgénère des chemins d'accès relatifs, assurez-vous donc cdd'un emplacement cohérent sur les deux machines)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. Copiez le cliché ACL sur le système avec des autorisations rompues

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. Restaurez le cliché ACL pour remplacer les autorisations rompues par celles de la bonne machine connue

    # cd /
    # setfacl --restore /root/acls.txt
    
Score_Under
la source