Sichern und Wiederherstellen von Dateiberechtigungen

16

Gibt es eine Möglichkeit zum Sichern und Wiederherstellen des Dateibesitzes und der Dateiberechtigungen (die Dinge, die mit chownund geändert werden können chmod)?

Sie können dies in Windows mit icacls tun .

Was ist mit Zugriffssteuerungslisten?

leeand00
quelle
Es wäre hilfreich, wenn Sie angeben, welche Distribution Sie verwenden, da verschiedene Distributionen unterschiedliche Paketmanager verwenden.
garethTheRed
@garethTheRed, hängt es auch von der verwendeten fs oder nur von der Distribution ab?
leeand00
1
Ich bezweifle, dass es vom Dateisystem abhängen würde.
garethTheRed
Bis jetzt gibt es keine perfekte Antwort.
Kittygirl

Antworten:

23

Sie können dies mit den Befehlen aus dem acl- Paket tun (das auf allen Mainstream-Distributionen verfügbar sein sollte, aber möglicherweise nicht Teil der Basisinstallation ist ). Sie sichern und stellen die ACL wieder her, wenn ACL vorhanden ist, funktionieren jedoch auch für grundlegende Berechtigungen, selbst auf Systemen, die keine ACL unterstützen.

So sichern Sie Berechtigungen im aktuellen Verzeichnis und seinen Unterverzeichnissen rekursiv:

getfacl -R . >permissions.facl

So stellen Sie Berechtigungen wieder her:

setfacl --restore=permissions.facl
Gilles 'SO - hör auf böse zu sein'
quelle
Hmm. Ich muss mich wirklich über ACLs informieren.
Roaima
1
Sind sie in der generierten Datei auch relativ zu einem Verzeichnis?
leeand00
2
@ leeand00 Ja, die generierte Datei verwendet immer relative Dateinamen.
Gilles 'SO - hör auf böse zu sein'
@ Gilles, basierend auf unix.stackexchange.com/questions/364517/… dateien setfacl kann das dann nicht chmodnochmal, wird das vielleicht zu konflikten führen?
Kittygirl
1
@ Kittygirl Ich habe keine Ahnung, was Sie fragen. Was bedeutet "setfacl files then can chmod again"? Was hat das mit unix.stackexchange.com/questions/364517/… zu tun ? Welcher Konflikt?
Gilles 'SO- hör auf böse zu sein'
2

Mir ist nichts "von der Stange" bekannt, das dies tun würde. Hier ist jedoch ein Starterskript für Sie, das grundlegende Berechtigungen behandelt. Es werden keine ACLs mit einer Beschreibung verarbeitet, Ihre Frage schließt diese jedoch ausdrücklich aus. (Pathologische Dateinamen, die mit Leerzeichen beginnen oder nicht druckbare Zeichen enthalten, schlagen ebenfalls fehl.)

Speichern Sie die Berechtigungen

find * -depth -exec stat --format '%a %u %g %n' {} + >/tmp/save-the-list

Stellen Sie die Berechtigungen wieder her

while read PERMS OWNER GROUP FILE
do
    chmod "$PERMS" "$FILE"
    chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list
Roaima
quelle
Meinen Sie, dass ACL auch bei pathologischen Dateinamen fehlschlägt?
Kittygirl
@kittygirl Ich habe keine Verarbeitung von ACLs in das Scriptlet aufgenommen, da das OP sie explizit von den Anforderungen ausgeschlossen hat. Sie können hinzufügen, was Sie möchten, wobei zu berücksichtigen ist, dass der Code nicht besonders robust ist (siehe den Kommentar zur Beschreibung der pathologischen Dateinamen).
Roaima
Ich habe ein Problem gefunden: kann nicht finden .htaccess, gitignore...
Kittygirl
0
#!/bin/bash
# prepare files
home="/home/exchange"
cd $home
>acl
echo "#!/bin/bash">recovery_acl.sh
echo "cd $home">>recovery_acl.sh
f='./'
# create acl file sorted by dir_level
for i in `seq 0 15`;do
  find . -mindepth $i -maxdepth $i -type d -exec getfacl {} +|grep -E '*UTS|file:'>>acl
done
sed -i 's/default\:user/\-dm\ u/g' acl
sed -i 's/default\:group/\-dm\ g/g' acl
sed -i 's/user/\-m\ u/g' acl
sed -i 's/group/\-m\ g/g' acl
sed -i 's/\#\ file\:\ /\.\//g' acl
sed -i 's,\\,\\\\,g' acl

while IFS='' read -r line ; do
  # grep dir name
  if echo "$line" | grep -q "$f" ; then
    dir="$line"
    continue
  fi
  echo setfacl $line '"'$dir'"'>>recovery_acl.sh
  # grep non def acl (for files)
  if echo "$line" | grep -q '\-m' ; then
    echo setfacl $line '"'$dir'"'/*>>recovery_acl.sh
  fi
done < "acl"

sed -i "s/\\\134/\\\\\\\134/g" recovery_acl.sh
sed -i "s/\\\040/\\\\ /g" recovery_acl.sh

Dieses Bash-Skript ruft nur dirs für acl ab (in meinem Fall files acls = dir (parent) acl). Nach der Ausführung des Skripts wird ein weiteres "recovery_acl.sh" erstellt.

Beim Wiederherstellen von Fehlern wie "Keine solche Datei oder Verzeichnis" bedeutet, dass dir leer ist oder dirname zwei / mehr Leerzeichen enthält.

Terentev Maksim
quelle