Чи є спосіб створити резервну копію та відновити право власності на файли та дозволи (речі, які можна змінити за допомогою chown
та chmod
)?
Це можна зробити в Windows за допомогою icacls .
Що щодо списків контролю доступу?
Чи є спосіб створити резервну копію та відновити право власності на файли та дозволи (речі, які можна змінити за допомогою chown
та chmod
)?
Це можна зробити в Windows за допомогою icacls .
Що щодо списків контролю доступу?
Відповіді:
Це можна зробити за допомогою команд з пакета acl (які повинні бути доступні у всіх основних потоках, але можуть не бути частиною базової установки). Вони створюють резервну копію та відновлюють ACL за наявності ACL, але вони також працюють для базових дозволів навіть у системах, які не підтримують ACL.
Для резервного копіювання дозволів у поточному каталозі та його підкаталогах:
getfacl -R . >permissions.facl
Щоб відновити дозволи:
setfacl --restore=permissions.facl
setfacl
потім chmod
знову не може, можливо, це спричинить конфлікт?
Я не знаю нічого "з полиці", яке б це зробило. Ось для вас початковий сценарій, який буде обробляти основні дозволи. Він не обробляє ACL-адреси будь-якого опису - але Ваше запитання явно виключає їх. (Також не вдасться отримати патологічні назви файлів - ті, що починаються з пробілів або містять символи, що не друкуються.)
Збережіть дозволи
find * -depth -exec stat --format '%a %u %g %n' {} + >/tmp/save-the-list
Відновити дозволи
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
Цей скрипт bash отримує лише acl dirs (у моєму випадку файли acls = dir (parent) acl) Після виконання сценарію буде створено ще один "recovery_acl.sh".
Під час відновлення помилок типу "Немає такого файлу чи каталогу" означає, що dir порожній або dirname має два / більше пробілів разом.