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?

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.


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.


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".


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
    
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.