Возможно ли создать script для сохранения и восстановления прав доступа?
Я использую linux-систему и вам нужно поэкспериментировать с некоторыми разрешениями на набор вложенных файлов и каталогов. Интересно, нет ли способа сохранить разрешения для файлов и каталогов, не сохраняя сами файлы.
Другими словами, я хотел бы сохранить perms, отредактировать некоторые файлы, настроить некоторые разрешения, а затем восстановить права на структуру каталогов, сохранив измененные файлы.
Это имеет смысл?
Ответы
Ответ 1
гм. поэтому вам нужно
1) читать разрешения файлов
2) хранить их как-то, связанные с каждым файлом
3) прочитайте ваши сохраненные разрешения и установите их обратно
не полное решение, а некоторые идеи:
stat -c%a filename
>644
возможно, в сочетании с
find -exec
чтобы сохранить эту информацию, этот вопрос имеет интересные идеи. в основном вы создаете временную файловую структуру, соответствующую вашим фактическим файлам, с каждым временным файлом, содержащим разрешения на файл
до reset вы выполняете итерацию по вашим временным файлам, читаете разрешения и chmod возвращаете фактические файлы.
Ответ 2
Самый простой способ - использовать инструменты ACL, даже если вы фактически не используете ACL. Просто позвоните getfacl -R . >saved-permissions
, чтобы создать резервные копии разрешений дерева каталогов и setfacl --restore=saved-permissions
, чтобы восстановить их.
В противном случае способ резервного копирования разрешений - find -printf
. (Требуется GNU, но то, что у вас есть в Linux.)
find -depth -printf '%m:%u:%g:%p\0' >saved-permissions
Вы получаете файл, содержащий записи, разделенные нулевым символом; каждая запись содержит числовые разрешения, имя пользователя, имя группы и имя файла для одного файла. Чтобы восстановить, зациклируйте записи и вызовите chmod
и chown
. Опция -depth
для find
заключается в том, что вы хотите сделать некоторые каталоги неназванными (сначала вам нужно обработать их содержимое).
Вы можете восстановить разрешения с помощью этого bash фрагмента, полученного из фрагмента, предоставленного Daniel Alder:
while IFS=: read -r -d '' mod user group file; do
chown -- "$user:$group" "$file"
chmod "$mod" "$file"
done <saved-permissions
Вы можете использовать следующий awk script, чтобы преобразовать вывод find
в некоторый код оболочки, чтобы восстановить разрешения.
find -depth -printf '%m:%u:%g:%p\0' |
awk -v RS='\0' -F: '
BEGIN {
print "#!/bin/sh";
print "set -e";
q = "\047";
}
{
gsub(q, q q "\\" q);
f = $0;
sub(/^[^:]*:[^:]*:[^:]*:/, "", f);
print "chown --", q $2 ":" $3 q, q f q;
print "chmod", $1, q f q;
}' > restore-permissions.sh
Ответ 3
Сначала установите пакет ACL:
sudo apt-get install acl
Рекурсивно сохранить разрешения и права собственности на файл:
getfacl -R yourDirectory > permissions.acl
Восстановить (относительно текущего пути):
setfacl --restore=permissions.acl
Ответ 4
Существует также специальный инструмент для метастор:
metastore - это инструмент для хранения метаданных файлов/каталогов/ссылок в дереве файлов в отдельный файл и последующего сравнения и применения сохраненных метаданных к указанному дереву файлов. Я написал этот инструмент в качестве дополнения к git, который не сохраняет все метаданные, что делает его непригодным для, например, сохранение /etc в репо. метастор также может быть полезен, если вы хотите создать tarball из дерева файлов и убедиться, что вместе с файлами хранится "все" (например, xattrs, mtime, owner, group).
Он также доступен как пакет Debian.
Ответ 5
сохранить find . -type f |xargs ls -la| awk '{print "chmod "$1" "$NF}'>./filesPermissions.sh
восстановить: sh ./filesPermissions.sh
Ответ 6
У меня есть Python script для этого в https://github.com/robertknight/mandrawer/blob/master/save-file-attrs.py
save-file-attrs.py save
Сохраняет разрешения, режим и время модификации файлов в дереве dir, укорененных в текущем рабочем каталоге, в локальный файл (.saved-file-attrs) и:
save-file-attrs.py restore
Восстановит эти атрибуты из файла и отобразит изменения.
Ответ 7
вы можете получить права доступа к файлам с помощью
ls -l | awk '{print $1" "$NF}'
который вернет список имен файлов и их разрешений.
сохраните его где-нибудь, и как только вы закончите - восстановите (chmod) разрешения каждого файла.
Ответ 8
Я нашел ответ от Дмитрия Л очень крутым. Но, к сожалению, он не работает, потому что он генерирует такие записи, как:
chmod -rw-r--r-- ./.bashrc
Чтобы избежать этого, я использую следующую команду:
find . -type f | xargs stat -c "%a %n" | awk '{print "chmod "$1" "$2}' > ./filesPermissions.sh
В основном, он делает то же самое, но генерирует восьмеричные записи, такие как:
chmod 644 ./.bashrc
который работает.
Ответ 9
Вот пример, который легко можно сделать с помощью одного файла. Никаких дополнительных инструментов, сценариев, временного файла и т.д. Не требуется. Вы можете расширить этот метод для работы с большим количеством файлов, если это необходимо.
В этом конкретном примере разрешения сохраняются в varibale с помощью команды stat
. Затем файл временно лишается каких-либо ограничительных разрешений. Затем с ним что-то делается (это может быть неудачно из-за этих предварительных ограничений). Наконец, восстанавливаются исходные разрешения.
file=$1
saved_permissions=$(sudo stat -c %a $file)
sudo chmod 777 $file
# <DO SOMETHING HERE>
sudo chmod $saved_permissions $file
Ответ 10
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Enter directory";
exit 0;
fi
# dump acls
cd $1
>acl
echo "#!/bin/bash">recovery_acl.sh
echo "cd $1">>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 '/^#/d' 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"
rm -f acl
sed -i 's/134/\\/g' recovery_acl.sh
sed -i 's/040/\ /g' recovery_acl.sh
После выполнения script будет создано другое "recovery_acl.sh".
Замените UTS на свой домен.
Ошибки типа "Нет такого файла или каталога" означают, что dir пуст.
Ответ 11
Я изменил команду Антона, чтобы получить дополнительную строку chown user: group/file_or_folder_path. Теперь вы можете получить bash script, который содержит две строки для каждого файла/папки.
Команда:
find . -type f | xargs stat -c "%a %U:%G %n" | awk '{print "chown "$2" "$3"\nchmod "$1" "$3}' > ./filesPermissions.sh
Пример вывода:
chown root:root /file_or_folder_path
chmod 777 /file_or_folder_path
Ответ 12
Я нашел лучший способ (для меня) сделать это с помощью Python!
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import json
import sys
import re
try:
import posix1e
except ImportError:
print("No module named 'posix1e'")
print("You need do: apt install python3-pylibacl")
sys.exit()
def dump_acl(dir):
acl_dict = {}
for root, dirs, files in os.walk(dir):
try:
path = root.split(os.sep)
root_acl = str(posix1e.ACL(file=root))
root_def_acl = str(posix1e.ACL(filedef=root))
#print(root_acl)
acl_dict[root] = root_acl
acl_dict["default_" + root] = root_def_acl
for file_name in files:
try:
if 'acl.json' in file_name:
continue
file_path = root + "/" + file_name
file_acl = str(posix1e.ACL(file=file_path))
acl_dict[file_path] = file_acl
#print(file_path)
except Exception as e:
print(e)
print(root, '/' + file_name)
continue
except Exception as e:
print(e)
print(root, '/' + file_name)
continue
with open(dir + '/acl.json', 'bw') as f:
f.write(json.dumps(acl_dict, ensure_ascii=False).encode('utf8'))
return
def recovery_acl(dir):
with open(dir + '/acl.json', 'r') as f:
acl_dict = json.load(f)
try:
for file_path, file_acl in acl_dict.items():
if file_path.startswith('default_'):
file_path = file_path.replace('default_', '', 1)
posix1e.ACL(text = file_acl).applyto(file_path, posix1e.ACL_TYPE_DEFAULT)
continue
if 'acl.json' in file_path:
continue
file_acl = file_acl.replace('\n', ',', file_acl.count('\n') -1)
file_acl = file_acl.replace('\134', u'\ ' [:-1])
file_acl = file_acl.replace('\040', u' ')
if 'effective' in file_acl:
file_acl = file_acl.replace('\t', '')
f_acl = re.sub('#effective:[r,w,x,-]{3}', '', file_acl)
posix1e.ACL(text = file_acl).applyto(file_path)
except Exception as e:
print(e, file_path, file_acl)
return
def help_usage():
print("Usage:")
print("For dump acl: ", sys.argv[0], "-d /path/to/dir")
print("For restore acl:", sys.argv[0], "-r /path/to/dir")
print("File with acls (acl.json) storing in the same dir")
sys.exit()
if len(sys.argv) == 3 and os.path.isdir(sys.argv[2]):
if sys.argv[1] == '-d':
dump_acl(sys.argv[2])
elif sys.argv[1] == '-r':
if os.path.exists(sys.argv[2] + '/acl.json'):
recovery_acl(sys.argv[2])
else:
print("File not found:", sys.argv[2] + '/acl.json')
else:
help_usage()
резервная копия acl: dump_acl.py -d/path/to/dir
восстановление acl: dump_acl.py -r/путь/к/каталог
После выполнения сценарий создает файл acl.json в том же каталоге (с резервным копированием/восстановлением acls).
Ответ 13
Я заимствую этот ответ из поста Роаймы.
Я думаю, что это должен быть лучший ответ:
Сохранить разрешения
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