Utwórz kopię zapasową i przywróć uprawnienia do plików

17

Czy istnieje sposób na wykonanie kopii zapasowej i przywrócenie własności pliku i uprawnień (rzeczy, które można zmienić za pomocą chowni chmod)?

Możesz to zrobić w systemie Windows za pomocą icacls .

Co z listami kontroli dostępu?

leeand00
źródło
Byłoby pomocne, gdybyś stwierdził, z której dystrybucji korzystasz, ponieważ różne dystrybucje używają różnych menedżerów pakietów.
garethTheRed
@garethTheRed, czy to zależy również od użytego fs, czy tylko dystrybucji?
leeand00
1
Wątpię, żeby to zależało od systemu plików.
garethTheRed
Do tej pory nie ma idealnej odpowiedzi.
Kittygirl

Odpowiedzi:

24

Możesz to zrobić za pomocą poleceń z pakietu acl (które powinny być dostępne we wszystkich głównych dystrybucjach, ale mogą nie być częścią instalacji podstawowej). Tworzą kopie zapasowe i przywracają ACL, gdy ACL są obecne, ale działają także w przypadku podstawowych uprawnień, nawet w systemach, które nie obsługują ACL.

Aby rekursywnie wykonywać kopię zapasową uprawnień w bieżącym katalogu i jego podkatalogach:

getfacl -R . >permissions.facl

Aby przywrócić uprawnienia:

setfacl --restore=permissions.facl
Gilles „SO- przestań być zły”
źródło
Hmm I naprawdę trzeba przeczytać na ACL.
roaima,
1
Czy w wygenerowanym pliku są one również względne względem katalogu?
leeand00
2
@ leeand00 Tak, wygenerowany plik zawsze używa względnych nazw plików.
Gilles „SO- przestań być zły”
@ Gilles, oparty na plikach unix.stackexchange.com/questions/364517/... setfacl to nie może chmodponownie, być może spowoduje konflikt?
Kittygirl
1
@ Kittygirl Nie mam pojęcia o co pytasz. Co znaczy „pliki setfacl nie mogą ponownie chmod”? Co to ma wspólnego z unix.stackexchange.com/questions/364517/... ? Jaki konflikt
Gilles „SO- przestań być zły”
2

Nie jestem świadomy niczego, co by to zrobiło. Oto skrypt startowy, który obsłuży podstawowe uprawnienia. Nie obsługuje list ACL żadnego opisu - ale Twoje pytanie wyraźnie je wyklucza. (Nie powiedzie się również w przypadku patologicznych nazw plików - zaczynających się od białych znaków lub zawierających znaki niedrukowalne).

Zapisz uprawnienia

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

Przywróć uprawnienia

while read PERMS OWNER GROUP FILE
do
    chmod "$PERMS" "$FILE"
    chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list
roaima
źródło
masz na myśli, że ACL również zawiedzie w przypadku patologicznych nazw plików?
Kittygirl
@kittygirl Nie uwzględniłem żadnego przetwarzania list ACL w skrypcie, ponieważ PO wyraźnie wykluczył je z wymagań. Możesz dodać to, co lubisz, pamiętając, że kod nie jest szczególnie niezawodny (patrz komentarz opisujący patologiczne nazwy plików).
roaima
Znalazłem problem: nie można znaleźć .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

Ten skrypt bash pobiera tylko katalogi acl (w moim przypadku pliki acls = dir (parent) acl) Po wykonaniu skryptu utworzy kolejny plik „recovery_acl.sh”.

Podczas odzyskiwania Błędy typu „Brak takiego pliku lub katalogu” oznaczają, że katalog jest pusty lub nazwa katalogu zawiera dwie / więcej spacji.

Terentev Maksim
źródło