Створіть резервні копії та відновлення дозволів на файли


17

Чи є спосіб створити резервну копію та відновити право власності на файли та дозволи (речі, які можна змінити за допомогою chownта chmod)?

Це можна зробити в Windows за допомогою icacls .

Що щодо списків контролю доступу?


Це допоможе, якщо ви вказали, який дистрибутив ви використовуєте, оскільки різні дистрибутиви використовують різні менеджери пакунків.
garethTheRed

@garethTheRed, це також залежить від використовуваного fs або просто дистрибутива?
leeand00

1
Сумніваюся, це залежатиме від файлової системи.
garethTheRed

До цього часу немає ідеальної відповіді.
kittygirl

Відповіді:


24

Це можна зробити за допомогою команд з пакета acl (які повинні бути доступні у всіх основних потоках, але можуть не бути частиною базової установки). Вони створюють резервну копію та відновлюють ACL за наявності ACL, але вони також працюють для базових дозволів навіть у системах, які не підтримують ACL.

Для резервного копіювання дозволів у поточному каталозі та його підкаталогах:

getfacl -R . >permissions.facl

Щоб відновити дозволи:

setfacl --restore=permissions.facl

Хм. Мені справді потрібно читати на ACL.
roaima

1
Чи в генерованому файлі вони відносно до каталогу також є?
leeand00

2
@ leeand00 Так, згенерований файл завжди використовує відносні імена файлів.
Жил "ТАК - перестань бути злим"

@ Gilles, заснований на файлах unix.stackexchange.com/questions/364517/…, setfacl потім chmodзнову не може, можливо, це спричинить конфлікт?
kittygirl

1
@kittygirl Я поняття не маю, про що ти питаєш. Що означає "файли setfacl, після чого неможливо знову chmod"? Що це стосується unix.stackexchange.com/questions/364517/… ? Який конфлікт?
Жил "ТАК - перестань бути злим"

2

Я не знаю нічого "з полиці", яке б це зробило. Ось для вас початковий сценарій, який буде обробляти основні дозволи. Він не обробляє 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

ти маєш на увазі, що ACL також не вдасться в патологічних іменах?
kittygirl

@kittygirl Я не включав будь-яку обробку ACL в скриплет, оскільки ОП явно виключив їх із вимог. Ви можете додати те, що вам подобається, маючи на увазі, що код не особливо надійний (див. Коментар, що описує патологічні назви файлів).
roaima

Я знайшов проблему: не можу знайти .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

Цей скрипт bash отримує лише acl dirs (у моєму випадку файли acls = dir (parent) acl) Після виконання сценарію буде створено ще один "recovery_acl.sh".

Під час відновлення помилок типу "Немає такого файлу чи каталогу" означає, що dir порожній або dirname має два / більше пробілів разом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.