Kopieren Sie die Berechtigungen in einen identischen Baum unter Linux / Unix


22

Ich habe einen Baum von Dateien mit der richtigen Erlaubnis. Dann habe ich einen (filewise) identischen Baum (mit unterschiedlichen Dateiinhalten hart) mit falschen Berechtigungen.

Wie kann ich das Berechtigungslayout von einem Baum auf einen anderen übertragen?

Antworten:


8

Dies kann mit der folgenden Shell-Zeile erfolgen:

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

Stellen Sie einfach den richtigen Wert für die Variablen D1 und D2 ein, verweisen Sie sie auf das Quell- und das Zielverzeichnis, führen Sie den Befehl aus, und die Verzeichnisse verfügen über synchronisierte Berechtigungen.


1
Dies setzt voraus, dass stat vorhanden ist. Ich habe leider festgestellt, dass der Befehlsstatus oft nicht vorhanden ist.
Mei

@ David, ich kenne kein solches System ohne stat. Es ist jedoch ziemlich trivial, die folgende "octal ls" -Version zu verwenden und die angegebene Lösung entsprechend anzupassen: alias ols = "ls -la | awk '{k = 0; für (i = 0; i <= 8; i ++) k + = ((substr (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i)); if (k) printf ("% 0o", k); print} ' "
drAlberT

Bricht , wenn jede beteiligte Bahn enthält jede Art von Sonderzeichen (Leerzeichen beginnt mit Bindestrichen, etc).
4.

31

Ich habe gerade einen neuen und einfachen Weg kennengelernt, um dies zu erreichen:

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

Dadurch wird eine Liste mit allen Berechtigungen und Eigentümern erstellt.

Gehen Sie dann zu einer Ebene über dem Ziel und stellen Sie die Berechtigungen mit wieder her

setfacl --restore=/root/perms.acl

Der Grund, warum Sie eine Ebene höher sein müssen, ist, dass alle Pfade in perms.acl relativ sind.

Sollte als root gemacht werden.


Dies ist eine sehr einfache und einfache Möglichkeit, Berechtigungen zu sichern und wiederherzustellen. Beachten Sie jedoch, dass getfaclund setfaclnicht unbedingt auf allen Systemen vorhanden sind.
the-wabbit

Ist es richtig, .acim ersten Befehl und .aclim zweiten zu haben?
Farbota

1
@sfarbota: Nein, es war ein Tippfehler! Korrigiert jetzt. Vielen Dank für den Hinweis.
Marlar

13

Wenn Sie die Quelle und das Ziel haben, können Sie Ihre Berechtigungen mit synchronisieren rsync -ar --perms source/ dest

Es werden keine Daten übertragen, nur Berechtigungen ...


1
Nein, es werden Dateien kopiert, wenn Zeitstempel unterschiedlich sind
yawniek

@yawniek Die -rund --permssind überflüssig, aber diese Synchronisation dauert immer noch, wenn sie das einzige sind, was anders ist (was Sie in der Frage gesagt haben; wenn die Bäume nicht wirklich identisch sind, sollten Sie nicht gesagt haben, dass sie identisch sind).
Chris S

ok, ich war damals unklar, ich meinte, dass die Baumstruktur die gleiche ist.
Yawniek

12

Sie können den Befehl find verwenden , um ein Skript mit den Befehlen zu erstellen, die Sie zum Kopieren der Berechtigungen benötigen. Hier ist ein kurzes Beispiel, mit den verschiedenen printf-Optionen können Sie noch viel mehr tun, z. B. den Eigentümer, die Gruppen-ID usw. abrufen.

$ 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
Ich vermute, das Argument -printf ist eine GNU-Erweiterung. HP-UX find hat es nicht.
Mei

1
Auch ohne die Option printf zu finden, kann man die Option ls (oder schlimmstenfalls die Pipe zu xargs ls -l) verwenden und in einer Datei speichern. Ein oder zwei Minuten Suchen und Ersetzen, und eine wird ein Skript mit chmod für jede Datei haben.
Mpez0

0

Zwei Wege:

  1. Wenn es auf Ihrer UNIX-Marke funktioniert: cp -ax / src / dest
  2. Andernfalls handelt es sich um die portable Version: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(im letzteren Fall muss / dst existieren)

Edit: sorry, ich habe falsch gelesen. Nicht was du gefragt hast.


Erwähnenswert ist, dass -a (für Archiv) eine GNU-Erweiterung zu cp ist, die ich auf keinem anderen System gesehen habe. Es ist nur eine Abkürzung für -dpR (keine De-Referenz, rekursiv, Berechtigungen beibehalten). Die Optionen R und p sollten in jeder Version von cp enthalten sein
theotherreceive

0

Ich denke, ich würde ein Perl-Skript schreiben, um es zu tun. So etwas wie:

#!/usr/bin/perl -nw

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

Dann mach so etwas:

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

Ich habe das auf den Kopf geschrieben und es wurde nicht getestet. Also überprüfe es, bevor du es zügellos laufen lässt. Dadurch werden nur Berechtigungen für vorhandene Verzeichnisse festgelegt. Es werden weder Berechtigungen für Dateien geändert noch fehlende Verzeichnisse erstellt.


0

Das habe ich mir ausgedacht:

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

Es ist nicht vollständig kugelsicher, tut aber, was ich brauche.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.