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ą chown
i chmod
)?
Możesz to zrobić w systemie Windows za pomocą icacls .
Co z listami kontroli dostępu?
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ą chown
i chmod
)?
Możesz to zrobić w systemie Windows za pomocą icacls .
Co z listami kontroli dostępu?
Odpowiedzi:
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
setfacl
to nie może chmod
ponownie, być może spowoduje konflikt?
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
.htaccess
, gitignore
...
#!/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.