Приношу свои извинения за глупый/простой вопрос, но после поиска в Интернете и SE я не могу найти ответ на этот конкретный вопрос.

Вопрос:
Как изменить владельца и группу (для всей системы) только для файлов, принадлежащих конкретному владельцу?

Пример использования:
У нас есть несколько RasP, работающих как разные серверы, и мы используем rsync для их резервного копирования. Когда нам, к сожалению, приходится выполнять восстановление, владельцем и группой всех «пользовательских» файлов является, например, pi:pi, а не первоначальный владелец adminuser:adminuser.

Где можно без поиска файлов, принадлежащих pi, выполнить переназначение владельца/группы?

Изменить: это команда rsync:

sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --exclude-from="${exc_path}" "${src_path}" "${dst_addr}:${dst_path}"
3
S3DEV 5 Дек 2020 в 23:55
Похоже, вы не используете -numeric-ids и/или -fake-super для резервного копирования (и восстановления)
 – 
roaima
5 Дек 2020 в 23:54
Большое Вам спасибо. Мы запускаем сценарий, содержащий эту строку, каждую ночь, где пунктом назначения является каталог ServerBackups/.../rsync/ на сервере NAS. Восстановление является точной инверсией... просто поменяйте местами пути src_path и dst_path.
 – 
S3DEV
6 Дек 2020 в 00:01

2 ответа

Лучший ответ

Вы не используете -numeric-ids и/или -fake-super для резервного копирования (и восстановления). Если вы немного измените команду rsync, сопоставления будут сохранены и восстановлены правильно.

В этих примерах -M указывает rsync применить следующую опцию, то есть подделку, на удаленной стороне соединения. Дополнительным побочным эффектом является то, что вам не нужна удаленная сторона (где хранятся резервные копии) для запуска от имени пользователя root.

Это отправляет резервные копии с клиента на сервер резервных копий.

sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids -M--fake-super --exclude-from="${exc_path}" "${src_path}" "${dst_addr}:${dst_path}"

Это приведет к извлечению резервных копий из клиента (т.е. восстановление)

sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids -M--fake-super --exclude-from="${exc_path}" "${dst_addr}:${dst_path}" "${src_path}"

И это, запущенное на сервере резервных копий, приведет к отправке резервных копий клиенту (т.е. восстановление)

sudo rsync -azh -e 'ssh -pNNNN' --stats --delete --numeric-ids --fake-super "${dst_path}" "${src_host}:${src_path}"
9
roaima 14 Дек 2020 в 12:14
Отлично, большое спасибо за то, что собрали это вместе. Я изменю сценарии, чтобы использовать аргументы --numeric-ids и -M--fake-super. Очень признателен.
 – 
S3DEV
6 Дек 2020 в 00:09
1
В качестве продолжения я восстановил резервную копию, используя два аргумента, и владелец/группа вернулся к тому, каким он должен быть. Еще раз спасибо дружище!
 – 
S3DEV
6 Дек 2020 в 00:32

Каждый файл хранит информацию о своем владельце индивидуально, нет структуры данных для индексации файлов на основе их владельцев. Итак, что бы вы ни делали, вам придется охотиться за файлами и менять UID для каждого из них по отдельности. К счастью, это не очень сложно сделать; это должно сделать:

find "$dir" -user olduser -exec chown newuser {} +

Конечно, было бы лучше изменить систему резервного копирования для хранения (и восстановления) правильных UID, особенно если у вас есть резервные копии файлов, принадлежащих нескольким пользователям.

6
ilkkachu 6 Дек 2020 в 00:04
Большое спасибо, что нашли время опубликовать этот отличный ответ. Я буду держать эту команду в кармане, и вы абсолютно правы с комментарием «исправить источник». Это план. Спасибо.
 – 
S3DEV
6 Дек 2020 в 00:11