Unix: Gibt es eine Möglichkeit, Datei- oder Verzeichnisberechtigungen zu „kopieren“?


14

Ich habe zwei Dateien in einem Verzeichnis. Einer hat die richtigen Berechtigungen und der andere nicht. Gibt es eine Möglichkeit, den Berechtigungssatz von einer Datei in eine andere zu "kopieren"?

Antworten:


15

Die GNU-Version des Dienstprogramms chmod kann den Modus von einer Datei ( RFile) in eine andere ( file) kopieren .

chmod --reference=RFile file

GNU coreutils ist unter anderem in den meisten Linux-Distributionen und Cygwin enthalten. Nicht alle chmod- Implementierungen bieten diese Option.


Hm ... sieht so aus, als ob das funktionieren soll, aber nicht unter Mac OS X unterstützt wird? Dort bekomme ich nur illegale Option ...
Svish

2
chmod ist kein in Bash eingebauter Befehl. Es ist ein separates Dienstprogramm, das auf vielen Unixen verfügbar ist. Die --referenceOption ist in der GNU-Version enthalten. OSX verwendet wahrscheinlich stattdessen ein chmod , das von BSD stammt. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
quack quixote

Svish, Sie könnten erwägen, die GNU-Versionen über MacPorts zu installieren.
Jeremy L

cp -dpR <source-file> <dest-file>Ich habe mir nur gedacht, dass es nützlich wäre, hier zu erwähnen, dass beim Kopieren einer Datei sowohl die Berechtigungen als auch die Datei.r
LawrenceC

1

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.


0

Versuche dies:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

Dies würde rekursiv nach oben gehen und jede Datei chmod. Wenn zwei Verzeichnisse für Dateien nicht übereinstimmen, wird der Fehler "Keine solche Datei oder solches Verzeichnis" häufig angezeigt.


find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez

chmod: Fehler beim Abrufen der Attribute von '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1': Keine solche Datei oder kein solches Verzeichnis chmod: Fehler beim Abrufen der Attribute von '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt ': Keine solche Datei oder kein solches Verzeichnis chmod: Attribute von' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt 'konnten nicht abgerufen werden Datei oder Verzeichnis chmod: Attribute von '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt' konnten nicht abgerufen werden: Keine Datei oder Verzeichnis
Rick Sanchez

hat es in 2 Ordnern getestet: test1 und test2. Jeder hat die gleichen Dateien 111/222 / 333.txt mit unterschiedlichen Berechtigungen. test1 hat die Standardeinstellungen. test2 hat 777 Berechtigungen. Das ist der Fehler, den ich bekomme.
Rick Sanchez

0

Mit können Sie getfacldie vollständige Liste der Dateiberechtigungen, Eigentümer, Gruppen und zusätzlichen ACLs (Zugriffssteuerungslisten) abrufen.

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

Wenn Sie diese Ausgabe in einer Datei speichern (zB acl.txt), können Sie dann aus diesem Format mit wiederherstellen setfacl --restore acl.txt. Wenn Sie nur eine einzelne Datei wiederherstellen möchten und diese Datei einen anderen Dateinamen als das Original hat, sollten Sie diesen verwenden setfacl --set-file acl.txt filename.txt(wobei filename.txtder neue Dateiname steht).

Schritte

  1. Speichern Sie die ursprünglichen Berechtigungen unter acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. Überschreibberechtigungen (zur Demonstration; dies ist nur so, dass Sie sehen können, dass das Wiederherstellen im nächsten Schritt funktioniert)

    $ 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. Verwenden Sie setfacldiese Option , um die richtigen Berechtigungen wiederherzustellen acl.txt:

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

Der Dateiname stammt aus dem # file:Kommentar, der von generiert wurde getfacl, sodass er nicht in der Befehlszeile angegeben werden muss.

Wenn Sie diese Berechtigungen für eine andere Datei wiederherstellen möchten, können Sie --set-filestattdessen --restoreFolgendes verwenden:

$ setfacl --set-file acl.txt second_filename.txt

Beispiel

Wenn Sie am Ende die Berechtigungen für einige Dateien in überschreiben /usr, aber nicht wissen, welche Dateien Sie überschrieben haben, können Sie dies normalerweise beheben, indem Sie sie von einem anderen, ähnlich konfigurierten System wiederherstellen.

  1. Sicherungsberechtigungen vom Arbeitssystem (Hinweis: getfaclGeneriert relative Pfade, stellen Sie also sicher, dass Sie cdauf beiden Computern einen konsistenten Speicherort haben.)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. Kopieren Sie den ACL-Speicherauszug mit fehlerhaften Berechtigungen auf das System

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. Stellen Sie den ACL-Speicherauszug wieder her, um die beschädigten Berechtigungen mit denen des als funktionierend bekannten Computers zu überschreiben

    # cd /
    # setfacl --restore /root/acls.txt
    
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.