Есть ли способ резервного копирования и восстановления прав собственности на файлы и прав доступа (что можно изменить с помощью 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 only dirs (в моем случае файлы acls = dir (parent) acl) После выполнения скрипта будет создано еще одно «recovery_acl.sh».
При восстановлении ошибки типа «Нет такого файла или каталога» означают, что dir пуст или dirname содержит два или более пробелов вместе.