Подтвердить что ты не робот

Возможно ли создать script для сохранения и восстановления прав доступа?

Я использую linux-систему и вам нужно поэкспериментировать с некоторыми разрешениями на набор вложенных файлов и каталогов. Интересно, нет ли способа сохранить разрешения для файлов и каталогов, не сохраняя сами файлы.

Другими словами, я хотел бы сохранить perms, отредактировать некоторые файлы, настроить некоторые разрешения, а затем восстановить права на структуру каталогов, сохранив измененные файлы.

Это имеет смысл?

4b9b3361

Ответ 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