Copia i permessi su un albero identico su linux / unix


22

ho un albero di file con il permesso corretto. poi ho un albero (filewise) identico (con diversi contenuti di file difficili) con permessi errati.

come posso trasferire il layout dei permessi da un albero all'altro?

Risposte:


8

Può essere fatto con la seguente linea di shell:

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

è sufficiente impostare il valore corretto per le variabili D1 e D2, puntarle alle directory di origine e di destinazione, eseguire e le directory avranno i permessi sincronizzati.


1
Ciò presuppone che stat sia presente. Ho trovato, purtroppo, che il comando stat spesso non è presente.
Mei,

@ David, non conosco un tale sistema privo di stat. Ma è abbastanza banale usare la seguente versione "ottale ls" e adattarsi di conseguenza alla soluzione data: 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

Si interrompe quando qualsiasi percorso coinvolto contiene qualsiasi tipo di carattere speciale (spazi bianchi, inizia con trattini, ecc.).
n.

31

Ho appena imparato un modo nuovo e semplice per ottenere questo risultato:

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

Questo genererà un elenco con tutte le autorizzazioni e le proprietà.

Quindi vai a un livello sopra la destinazione e ripristina le autorizzazioni con

setfacl --restore=/root/perms.acl

Il motivo per cui devi essere di un livello superiore è che tutti i percorsi in perms.acl sono relativi.

Dovrebbe essere fatto come root.


questo è un modo molto semplice e semplice per il backup e il ripristino delle autorizzazioni. Si noti tuttavia che getfacle setfaclnon sono necessariamente presenti su tutti i sistemi.
the-wabbit,

È corretto avere .acnel primo comando e .aclnel secondo?
sfarbota,

1
@sfarbota: No, era un errore di battitura! Corretto ora. Grazie per segnalarlo.
marlar,

13

Se hai l'origine e la destinazione, puoi sincronizzare le tue autorizzazioni con rsync -ar --perms source/ dest

Non trasferirà i dati, solo le autorizzazioni ...


1
no, copierà i file se i timestamp differiscono
yawniek,

@yawniek I -re --permssono ridondanti, ma questo sincronizza ancora se sono l'unica cosa diversa (che è quello che hai detto nella Domanda; se gli alberi non sono effettivamente identici non avresti dovuto dire che lo erano).
Chris S,

ok non ero chiaro allora, intendevo dire che la struttura ad albero è la stessa.
Yawniek,

12

Una cosa che potresti fare è usare il comando find per creare uno script con i comandi necessari per copiare le autorizzazioni. Ecco un breve esempio, potresti fare molto di più con le varie opzioni di stampa, tra cui ottenere il proprietario, l'ID del gruppo e così via.

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

1
Ho il sospetto che l'argomento -printf per trovare sia un'estensione GNU? HP-UX find non ce l'ha.
Mei,

1
Anche senza l'opzione printf da trovare, si può usare l'opzione ls (o, nel peggiore dei casi, pipe to xargs ls -l) e salvare in un file. Un minuto o due di ricerca e sostituzione, e uno avrà uno script con chmod per ogni file.
mpez0,

0

Due strade:

  1. Se funziona sul tuo marchio UNIX: cp -ax / src / dest
  2. Altrimenti, questa è la versione portatile: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(in quest'ultimo caso / dst deve esistere)

Modifica: scusa, ho letto male. Non quello che hai chiesto.


Vale la pena ricordare che -a (per archivio) è un'aggiunta GNU a cp, non l'ho mai visto su nessun altro sistema. È solo l'abbreviazione di -dpR (nessun de-riferimento, ricorsivo, preserva le autorizzazioni). Le opzioni R e p dovrebbero essere in qualsiasi versione di cp
theotherreceive,

0

Penso che scriverei uno script perl per farlo. Qualcosa di simile a:

#!/usr/bin/perl -nw

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

Quindi fai qualcosa del genere:

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

L'ho scritto dalla cima della mia testa e non è stato testato; quindi controllalo prima di lasciarlo correre dilagante. Questo risolve solo le autorizzazioni per le directory esistenti; non modificherà le autorizzazioni per i file, né creerà directory mancanti.


0

Ho pensato a questo:

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

Non è completamente a prova di proiettile, ma fa quello che mi serve.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.