Copiez les autorisations dans une arborescence identique sous Linux / Unix

22

j'ai un arbre de fichiers avec l'autorisation correcte. alors j'ai un arbre (filewise) identique (avec différents contenus de fichiers difficiles) avec de mauvaises autorisations.

comment puis-je transférer la disposition des autorisations d'une arborescence à une autre?

yawniek
la source

Réponses:

8

Cela peut être fait avec la ligne de shell suivante:

D1=foo; D2=foo2; for entry in $(find $D1  -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done

définissez simplement la bonne valeur pour les variables D1 et D2, pointez-les vers les répertoires source et de destination, exécutez et les répertoires auront des autorisations synchronisées.

drAlberT
la source
1
Cela suppose que stat est présent. J'ai constaté, malheureusement, que la commande stat n'est souvent pas présente.
Mei
@ David, je ne connais pas un tel système sans statistiques. Mais il est assez trivial d'utiliser la version "octal ls" suivante et d'accommoder la solution donnée en conséquence: alias ols = "ls -la | awk '{k = 0; for (i = 0; i <= 8; i ++) k + = ((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); if (k) printf (\ "% 0o \", k); print} ' "
drAlberT
Pauses quand tout chemin impliqué contient une sorte de caractère spécial (espaces, commence par des tirets, etc.).
2017
31

Je viens d'apprendre une façon nouvelle et simple d'accomplir cela:

getfacl -R /path/to/source > /root/perms.acl

Cela générera une liste avec toutes les autorisations et propriétés.

Ensuite, allez à un niveau au - dessus de la destination et restaurez les autorisations avec

setfacl --restore=/root/perms.acl

La raison pour laquelle vous devez être un niveau au-dessus est que tous les chemins d'accès dans perms.acl sont relatifs.

Doit être fait en tant que root.

marlar
la source
il s'agit d'un moyen très direct et simple de sauvegarder et de restaurer les autorisations. Notez cependant que getfaclet setfaclne sont pas nécessairement présents sur tous les systèmes.
le-wabbit
Est-il correct d'avoir .acdans la première commande et .acldans la seconde?
sfarbota
1
@sfarbota: Non, c'était une faute de frappe! Corrigé maintenant. Merci de l'avoir signalé.
marlar
13

Si vous avez la source et la destination, vous pouvez synchroniser vos autorisations avec rsync -ar --perms source/ dest

Il ne transférera pas les données, juste des autorisations ...

Dom
la source
1
non, il copiera les fichiers si les horodatages diffèrent
yawniek
@yawniek The -ret --permssont redondants, mais cela permet toujours de synchroniser s'ils sont la seule chose qui est différente (c'est ce que vous avez dit dans la question; si les arbres ne sont pas réellement identiques, vous n'auriez pas dû dire qu'ils l'étaient).
Chris S
ok je n'étais pas clair alors, je voulais dire que la structure arborescente est la même.
yawniek
12

Une chose que vous pourriez faire est d'utiliser la commande find pour créer un script avec les commandes dont vous avez besoin pour copier les autorisations. Voici un exemple rapide, vous pourriez faire beaucoup plus avec les différentes options de printf, y compris obtenir le propriétaire, l'ID de groupe, etc.

$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...
Zoredache
la source
1
Je soupçonne que l'argument -printf pour trouver est une extension GNU? HP-UX find ne l'a pas.
Mei
1
Même sans l'option printf à rechercher, on peut utiliser l'option ls (ou, au pire, diriger vers xargs ls -l) et enregistrer dans un fichier. Une minute ou deux de recherche et de remplacement, et l'un aura un script avec chmod pour chaque fichier.
mpez0
0

Deux voies:

  1. Si cela fonctionne sur votre marque UNIX: cp -ax / src / dest
  2. Sinon, voici la version portable: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(dans ce dernier cas / dst doit exister)

Edit: désolé, j'ai mal lu. Pas ce que tu as demandé.

Thomas
la source
Il convient de mentionner que -a (pour l'archivage) est un ajout GNU à cp, je ne l'ai jamais vu sur aucun autre système. C'est juste court pour -dpR (pas de dé-référence, récursif, conserver les autorisations). Les options R et p devraient être dans n'importe quelle version de cp
theotherreceive
0

Je pense que j'écrirais un script perl pour le faire. Quelque chose comme:

#!/usr/bin/perl -nw

my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;

Ensuite, faites quelque chose comme ceci:

cd /some/old/orig/path/ ; find . -type d | perlscript

J'ai écrit cela du haut de ma tête, et cela n'a pas été testé; alors vérifiez-le avant de le laisser courir. Cela corrige uniquement les autorisations sur les répertoires existants; il ne modifiera pas les autorisations sur les fichiers, ni ne créera de répertoires manquants.

Mei
la source
0

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