Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Восстановление прав и владельцев файлов

#linux #bash


Было скопировано с помощью rsync -avz (или -rvz) с сервера на сервер несколько сайтов,
и у многих файлов поменялся владелец и сменились права.

Чтобы восстановить права, первое и единственное, что пришло в голову, это:


На исходном сервере запустить ls -lah /www/sait1 > permis.file
пробежаться таким образом по всем папкам, вложенным тоже.
перекинуть результат на новый сервер, распарсить все, и уже обратным образом, пробегая
по папкам, назначить нужные права.


Меня смущает сам метод.

Есть более правильное или другое решение сложившейся проблемы?

Про архивацию через tar не предлагать, про нее знаю, проблема возникла - ее надо решать.
    


Ответы

Ответ 1



Самое простое и быстрое, что пришло в голову - это сделать на первой машине # для данных о каталогах find / -type d -exec stat -c "%n %a %G %U" {} \; | awk '{print "chown "$3":"$4" "$1"; chmod "$2" "$1}' > dirs.txt # для данный о файлах find / -type f -exec stat -c "%n %a %G %U" {} \; | awk '{print "chown "$3":"$4" "$1"; chmod "$2" "$1}' > files.txt полученные файлы переносятся на целевую машину, изучаются, фильтруются по мере надобности. А потом накатываются с помощью bash bash dirs.txt bash files.txt То есть, вначале накатываются данные для каталогов, а только потом для файлов. Иначе может сложиться ситуация, когда накатить права для файлов не получиться, так как нет доступа. можно было бы теоретически это все в одну команду выполнить, но мне было лень дописывать фильтрацию каталогов "." и "..".

Ответ 2



согласно man rsync, опция -a является «сокращением» для набора опций: -rlptgoD. среди них фигурирует опция -p — сохранение прав/разрешений (permissions). т.е., права/разрешения после завершения копирования должны быть в точности те же, что и у исходных файлов/каталогов, и их изменение не требуется. среди опций фигурируют и -g — сохранение группы-владельца, и -o — сохранение пользователя-владельца. понятно, что произвольное изменение пользователя и/или группы у целевых файлов/каталогов возможно только в том случае, если процесс rsync в целевой системе выполняется с полномочиями суперпользователя. но даже при наличии таких полномочий могут возникнуть «нестыковки»: по умолчанию rsync пытается использовать те же имена для пользователей/групп, как и в исходной системе, и лишь при отсутствии таких пользователей/групп использует числовые идентификаторы (в целевой системе может и не быть пользователей/групп с такими идентификаторами). кстати, это поведение можно изменить с помощью опции --numeric-ids (не будет производиться поиск соответствующих имён). как быть в подобной ситуации? я вижу два варианта: после копирования можно изменить принадлежность файлов/каталогов (sudo chown -R пользователь:группа каталог). этот вариант также является единственным в том случае, если нет возможности выполнить rsync в целевой системе от имени суперпользователя. до копирования можно создать недостающие в целевой системе группы/пользователей с именами, используемыми в исходной системе (соответствие числовых идентификаторов необязательно — см. предыдущий абзац). кстати, если копирование уже было произведено, то достаточно лишь ещё раз запустить rsync с теми же параметрами/опциями — принадлежность будет изменена (проверил — меняется). p.s. не стоит забывать про существование опции -n — при её наличии rsync не будет ни копировать, ни производить какие-либо изменения, а лишь сообщит о том, что собирается сделать.

Комментариев нет:

Отправить комментарий