Rsync mit Zielbesitzer und Berechtigung möglich?

Rsync mit Zielbesitzer und Berechtigung möglich?

Der Quellserver hat einen Besitzer: Root.

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

Das Ziel ist mein lokaler Computer.

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

Wie kann ich eine neue Update-Datei vom Quellserver mit der lokalen Maschine synchronisieren, ohne den lokalen Besitzer zu ändern?

Bearbeiten

Ich muss alle Quellen mit einem Befehl synchronisieren, da ich viele Ordner habe und der lokale Rechner auch viele Besitzer hat. Vielleicht ist das möglich?

Danke.

Antwort1

Es klingt, als ob Sie nach der Übertragung keine Änderungen wünschen.

Versuchen Sie den folgenden Befehl:

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

Wenn Sie diese Optionen nicht verwenden, werden Benutzer und Gruppe auf der Empfangsseite auf den aufrufenden Benutzer geändert. Wenn Sie einen anderen Benutzer angeben möchten, müssen Sie Ihrem Skript einen chown-Befehl hinzufügen.

-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

Antwort2

Ich denke, eine gute Option für Sie könnte sein, einfach normal von der Quelle zum Ziel zu synchronisieren, vorausgesetzt, es handelt sich um eine separate physische Dateisystemübertragung, und zwar mit etwas wie

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

und wenn dann alles an die richtige Stelle auf dem neuen System kopiert wurde, finden Sie heraus, welche neuen UIDs Ihr System den Daten vom Quellsystem gegeben hat. Es ist wahrscheinlich 1001, 1002 usw. In diesem Fall können Sie ganz einfach einen

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

Ja, das Letzte müssten Sie 100 Mal machen, aber Sie könnten das problemlos skripten, wenn Sie die während rsync verwendete UID-Sequenz kennen. Ich habe genau das einmal gemacht, als ich etwa 60 Benutzer von einem Server auf einen anderen migriert habe, und es hat einigermaßen gut funktioniert. Ich musste auch Gruppenberechtigungen ersetzen, ähnliche Sache;

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

So was. Hoffe, du kannst das gebrauchen.

Antwort3

Das geht nicht mit einem einzigen Befehl. Allerdings ist es selbst bei über 100 Benutzern ziemlich einfach, die Aufgabe zu automatisieren, daher verstehe ich nicht, warum Sie darauf bestehen, dass es ein einziger Befehl sein muss.

Du brauchstziehendie Daten in diesem Szenario vom Zielrechner. Theoretisch wäre es möglich, die Übertragung vom Quellserver durch Tunneln rsyncüber einen Reverse- sshTunnel durchzuführen, was jedoch wesentlich komplizierter wäre.

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

Wenn Sie die Flagge nicht haben, --chownkönnen Sie dies mit einem zweistufigen Prozess emulieren:

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

Wenn Sie die Variante verwenden müssen findund Ihr findnicht versteht +, ersetzen Sie sie durch die etwas weniger effiziente \;(das ist ein Backlash-Semikolon).

verwandte Informationen