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- ssh
Tunnel 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, --chown
kö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 find
und Ihr find
nicht versteht +
, ersetzen Sie sie durch die etwas weniger effiziente \;
(das ist ein Backlash-Semikolon).