원본 서버에는 루트라는 한 명의 소유자가 있습니다.
----/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번 수행해야 하지만 rsync 중에 사용되는 UID 시퀀스를 알고 있으면 쉽게 스크립트를 작성할 수 있습니다. 한 번은 약 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
다음 2단계 프로세스로 시뮬레이션할 수 있습니다.
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
이해가 되지 않는다면 +
약간 덜 효율적인 변형 \;
(예: 백래시 세미콜론)으로 바꾸세요.