Резервное копирование и восстановление прав доступа к файлам

17

Есть ли способ резервного копирования и восстановления прав собственности на файлы и прав доступа (что можно изменить с помощью chownи chmod)?

Вы можете сделать это в Windows, используя icacls .

А как насчет списков контроля доступа?

leeand00
источник
Было бы полезно, если бы вы указали, какой дистрибутив вы используете, поскольку разные дистрибутивы используют разные менеджеры пакетов.
garethTheRed
@garethTheRed, это также зависит от используемого фс или просто дистрибутива?
leeand00
1
Я сомневаюсь, что это будет зависеть от файловой системы.
garethTheRed
До сих пор нет идеального ответа.
Kittygirl

Ответы:

24

Вы можете сделать это с помощью команд из пакета acl (который должен быть доступен во всех основных дистрибутивах, но может не входить в базовую установку). Они создают резервные копии и восстанавливают ACL при наличии ACL, но они также работают для базовых разрешений даже в системах, которые не поддерживают ACL.

Для рекурсивного резервного копирования разрешений в текущем каталоге и его подкаталогах:

getfacl -R . >permissions.facl

Чтобы восстановить разрешения:

setfacl --restore=permissions.facl
Жиль "ТАК - прекрати быть злым"
источник
Хм. Мне действительно нужно читать ACL.
Ройма
1
В сгенерированном файле они тоже относятся к каталогу?
leeand00
2
@ leeand00 Да, сгенерированный файл всегда использует относительные имена файлов.
Жиль "ТАК - перестань быть злым"
@ Жиль, основанный на 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
roaima
источник
Вы имеете в виду, что ACL также потерпит неудачу на патологических именах файлов?
котенок
@kittygirl Я не включал обработку ACL в скриптлет, потому что OP явно исключил их из требований. Вы можете добавить то, что вам нравится, имея в виду, что код не особенно надежен (см. Комментарий с описанием патологических имен файлов).
роайма
Я нашел проблему: не могу найти .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 only dirs (в моем случае файлы acls = dir (parent) acl) После выполнения скрипта будет создано еще одно «recovery_acl.sh».

При восстановлении ошибки типа «Нет такого файла или каталога» означают, что dir пуст или dirname содержит два или более пробелов вместе.

Терентьев Максим
источник