Frage Kopieren Sie Berechtigungen unter Linux / Unix in den identischen Baum


Ich habe einen Baum von Dateien mit korrekter Erlaubnis. dann habe ich einen (dateiweise) identischen Baum (mit unterschiedlichen Dateiinhalten) mit falschen Berechtigungen.

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


21
2017-08-25 06:59


Ursprung




Antworten:


Es kann mit der folgenden Shell-Zeile gemacht werden:

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

Legen Sie einfach den richtigen Wert für D1- und D2-Variablen fest, zeigen Sie sie auf die Quell- und Zielverzeichnisse, führen Sie sie aus, und die Verzeichnisse haben Berechtigungen synchron.


8
2017-08-25 08:10



Find, sed und awk in einer Zeile. Ich liebe das (ich mache es auch). - Thomas
ein bisschen lang aber perfekt! Hinweis: foo sollte $ D1 sein - yawniek
Dies setzt voraus, dass stat vorhanden ist. Ich habe leider festgestellt, dass der Befehl stat oft nicht vorhanden ist. - Mei
@ nemester sicher, korrigiert danke :) - drAlberT
@David, ich kenne kein solches System ohne Stat. Aber es ist ziemlich trivial, die folgende "octal ls" -Version zu verwenden und die gegebene 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)); wenn (k) printf (\ "% 0o \", k); print} ' " - drAlberT


Ich habe gerade einen neuen und einfachen Weg kennengelernt:

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

Dies wird eine Liste mit allen Berechtigungen und Besitzern generieren.

Gehe dann auf eine Ebene über das Ziel und die Berechtigungen mit wiederherstellen

setfacl --restore=/root/perms.acl

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

Sollte als root erfolgen.


27
2018-02-26 13:05



Dies ist eine sehr einfache und einfache Möglichkeit zum Sichern und Wiederherstellen von Berechtigungen. Beachten Sie jedoch das getfacl und setfacl sind nicht notwendigerweise auf allen Systemen vorhanden. - the-wabbit
Ist es richtig zu haben? .ac im ersten Befehl und .acl in dieser Sekunde? - sfarbota
@sfarbota: Nein, es war ein Tippfehler! Jetzt korrigiert. Danke, dass du es aufgezeigt hast. - marlar


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

Es überträgt nicht die Daten, nur Berechtigungen ...


13
2017-08-25 07:28



Nein, es wird Dateien kopieren, wenn Timestamps abweichen - yawniek
@yawniek -r und --permssind redundant, aber dies synchronisiert immer noch, wenn sie das einzige sind, was anders ist (was du in der Frage gesagt hast; wenn die Bäume nicht wirklich identisch sind, hättest du nicht sagen sollen, dass sie es waren). - Chris S
ok ich war damals unklar, ich meinte, dass die baumstruktur gleich ist. - yawniek


Eine Sache, die Sie tun könnten, ist die Verwendung der finden Befehl zum Erstellen eines Skripts mit den Befehlen zum Kopieren der Berechtigungen. Hier ist ein kurzes Beispiel, Sie könnten viel mehr mit den verschiedenen printf-Optionen tun, einschließlich der Besitzer, Gruppen-ID und so weiter.

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

12
2017-08-25 07:34



Ich vermute, dass das Argument -printf eine GNU-Erweiterung ist? HP-UX findet es nicht. - Mei
Auch ohne die printf-Option zu finden, kann man die ls-Option (oder im schlimmsten Fall pipe to xargs ls -l) verwenden und in einer Datei speichern. Ein oder zwei Minuten suchen und ersetzen, und eines wird ein Skript mit chmod für jede Datei haben. - mpez0


Zwei Wege:

  1. Wenn es unter Ihrer UNIX-Marke funktioniert: cp -ax / src / dest
  2. Oder wenn nicht, ist dies die portable Version: (cd / src && tar cpf -.) | (cd / dst && tar xpf -)

(im letzteren Fall muss / dst existieren)

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


0
2017-08-25 08:28



Es ist erwähnenswert, dass -a (für Archiv) eine GNU-Ergänzung zu cp ist, ich habe es noch nie auf einem anderen System gesehen. Es ist nur kurz für -dpR (keine De-Referenz, rekursiv, erhalten Berechtigungen). Die Optionen R und P sollten in jeder Version von cp sein - theotherreceive


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 schrieb dies von meinem Kopf und es wurde nicht getestet; also überprüfe es, bevor du es grassieren lässt. Dies behebt nur die Berechtigungen für vorhandene Verzeichnisse. Die Berechtigungen für Dateien werden nicht geändert, und es werden keine fehlenden Verzeichnisse erstellt.


0
2017-08-25 09:14





Ich kam auf Folgendes:

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

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


0
2017-07-23 23:46