Возможен ли Rsync с владельцем назначения и разрешением?

Возможен ли Rsync с владельцем назначения и разрешением?

У исходного сервера один владелец — root.

----/home/sub1/test1 
----/home/sub2/test1

Мой локальный компьютер — пункт назначения.

----/home/sub1/test1 owner by user1
----/home/sub2/test1 owner by user2

Как синхронизировать новый файл обновления с исходного сервера на локальную машину и не менять локального владельца?

Редактировать

Мне нужно синхронизировать все источники одной командой, потому что у меня много папок и у локальной машины тоже много владельцев. Возможно ли это?

Спасибо.

решение1

Похоже, вы не хотите, чтобы они изменились после переноса.

Попробуйте следующую команду:

rsync -avr -o -g /source/directory user@:destinationHost/destination/directory

Если вы не используете эти параметры, пользователь и группа будут изменены на вызывающего пользователя на принимающей стороне. Если вы хотите указать другого пользователя, вам нужно будет добавить команду chown в ваш скрипт.

-o, --owner
    This option causes rsync to set the owner of the destination file to be 
    the same as  the source file, but only if the receiving rsync is being run 
    as the super-user (see also the --super and --fake-super options). Without 
    this option, the owner of new and/or transferred files are set to the invoking 
    user on the receiving side...

-g, --group
    This option causes rsync to set the group of the destination file to be the same as 
    the source file. If the receiving program is not running as the super-user (or if
    --no-super was specified), only groups that the invoking user on the receiving side
    is a member of will be preserved. Without this option, the group is set to the default
    group of the invoking user on the receiving side...

SEE MAN rsync

решение2

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

rsync -e 'ssh -p 22' -quaxz --bwlimit=1000 --del --no-W --delete-excluded --exclude-from=/excludedstufflist /sourcedir serverIP:/destinationdir

и затем, когда все это будет скопировано в нужное место в новой системе, выясните, какие новые UID ваша система дала данным из исходной системы. Это, вероятно, 1001, 1002 и т. д. В этом случае вы можете легко сделать

find /destinationdir -user 1001 -exec chown username '{}' \;
find /destinationdir -user 1002 -exec chown otherusername '{}' \;
etc.

Да, вам придется сделать это последнее 100 раз, но вы можете легко написать скрипт, если знаете последовательность UID, используемую во время rsync.. Я сделал именно это однажды, перенеся около 60 пользователей с одного сервера на другой, и это сработало достаточно хорошо. Мне также нужно было заменить групповые разрешения, аналогичная сделка;

chown --from=oldguy newguy * -R
chown --from=:friends :family * -R

Что-то в этом роде. Надеюсь, вам это пригодится.

решение3

Это нельзя сделать одной командой. Однако даже при наличии более 100 пользователей автоматизировать задачу довольно просто, поэтому я не понимаю, почему вы настаиваете, чтобы это была одна команда.

Вам нужнотянутьданные с машины назначения в этом сценарии. Теоретически было бы возможно управлять передачей с исходного сервера путем туннелирования rsyncпо обратному sshтуннелю, что было бы значительно сложнее.

for testdir in /home/sub*/test1
do
    owner=$(stat -c %u "$testdir")
    rsync -avP --chown "$u" sourceserver:"$testdir"/ "$testdir"/
done

Если у вас нет --chownфлага, вы можете сымитировать это с помощью двухэтапного процесса:

for testdir in /home/sub*/test1
do
    owner=$(stat -c %u "$testdir")
    rsync -avP --no-owner sourceserver:"$testdir"/ "$testdir"/
    chown -R "$u" "$testdir"                   # If possible
    # find "$testdir" -exec chown "$u" {} +    # Otherwise
done

Если вам нужно использовать findвариант, а ваш findне понимает +, замените его на немного менее эффективный \;(это обратная точка с запятой).

Связанный контент