2

Я использую метод, описанный здесь, чтобы скопировать каталог с одного сервера Unix на другой (оба Ubuntu 14.04):

rsync -aruv localfolder/ user@server:destination/

Мне нужно сохранить тех же владельцев и разрешения, но идентификаторы пользователей на новом компьютере могут отличаться. Я думаю, именно поэтому описанный метод не работает для меня должным образом: все файлы получают владельца my-user:my-user (предположительно, я использую my-user@server) для копирования файлов на сервер.

Итак, в основном, что мне нужно сделать, это скопировать папку (сделал это), а затем, для каждого файла, проверить, каков ID пользователя с тем же именем на новой машине, и обновить владельца на новой машине. с новым идентификатором.
Это возможно? Или есть более простой способ сделать это?


Это то, что я сделал в конце, но это не изящное решение, и ответ Михаэля Кьёрлинга должен быть предпочтительным.

2 ответа2

4

Это поведение, которое вы ищете, управляется параметром rsync -o (--owner), возможно, вместе с --no-numerics-ids . Страница man описывает владельца - таким образом (мой акцент):

-o, --owner
Эта опция заставляет rsync установить владельца целевого файла таким же, как исходный файл, но только если принимающий rsync запускается как суперпользователь (см. Также параметры --super и --fake-super), Без этой опции владелец новых и / или переданных файлов устанавливается вызывающим пользователем на принимающей стороне.

Сохранение владения будет связывать совпадающие имена по умолчанию, но в некоторых случаях может вернуться к использованию идентификационного номера (см. Также параметр --numeric-ids для полного обсуждения).

Есть похожая опция -g (--group), которая работает с группами.

Тем не менее, оба должны подразумеваться как -a что означает, что вам нужно что-то большее. Это "нечто большее" подробно описано в этом небольшом кусочке в описании опции, который ИМО довольно легко пропустить:

только если принимающий rsync запускается как суперпользователь

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

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

1

Это то, что я сделал в конце, но это не изящное решение.

К счастью, я знал, что будут только файлы, принадлежащие пользователям ftp, www-data, my-user, root и группам ftp, www-data, root.

Итак, на старой машине я запустил (в базе скопировал папку)

find . -user ftp -print > temp-user.ftp.txt
find . -user www-data -print > temp-user.www-data.txt
find . -user my-user -print > temp-user.my-user.txt
find . -user root -print > temp-user.root.txt
find . -group ftp -print > temp-group.ftp.txt
find . -group www-data -print > temp-group.www-data.txt
find . -group root -print > temp-group.root.txt

Теперь, например, temp-user.ftp.txt содержит список всех файлов, принадлежащих пользователю ftp. И temp-group.ftp.txt - это список всех файлов с группой ftp. Например, temp-user.ftp.txt может выглядеть так:

./some-file.txt
./a-directory
./a-directory/lower-level-file.mp3

Используйте некоторый редактор, чтобы он выглядел следующим образом (например, замените \n на "\nchown *** " и немного очистите вручную в начале и конце файла):

chown ftp "./some-file.txt"
chown ftp "./a-directory"
chown ftp "./a-directory/lower-level-file.mp3"

Здесь, конечно, измените chown ftp в соответствии с файлом - temp-group.www-data.txt получит chgrp www-data и т.д.

И эти файлы я запустил на новом сервере, с рутом.

Так что это сработало для меня, но опять же,

  • это не хорошее решение,
  • это требует довольно ручной работы,
  • и требует, чтобы вы знали, какие пользователи и группы владеют файлами в каталоге.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .