So ordnen Sie Benutzer- / Gruppenbesitz in rsync willkürlich zu

16

Ich muss ein Verzeichnis mit einem Remote-Server synchronisieren, damit alle Dateien von Benutzer X und Gruppe Y auf dem Quellcomputer (lokal) dem Benutzer W und der Gruppe Z auf dem Zielcomputer (Remotecomputer) zugeordnet werden. Wenn möglich mit ssh als Transport, aber wenn ich den rsync-Daemon verwenden muss, ist es auch in Ordnung.

Gibt es eine Möglichkeit, das zu tun? Ich suche nach einer Möglichkeit, eine beliebige Benutzer- / Gruppenzuordnung zu erstellen, z

local user X => remote user W
local group Y => remote group Z
... and as many of these as needed.

Dies sollte ein ziemlich häufiger Anwendungsfall sein, nicht wahr? ZB habe ich Dateien auf meinem lokalen Computer, auf denen mein Benutzername X lautet, und ich muss sie auf einen Webserver hochladen, auf dem sie einem bestimmten Benutzer gehören müssen, der weder denselben Namen noch dieselbe UID wie mein Benutzer hat mein PC.

Ich kann das nicht auf der Manpage von rsync finden ...

LINUX auf lokalem und Remote-Computer (Ubuntu local, centOS remote)

Befehl, den ich ausprobiert habe: rsync -avz / path / to / local [email protected]: / path / to / remote

matteo
quelle
1
Bitte geben Sie immer Ihr Betriebssystem an. Lösungen hängen sehr oft vom verwendeten Betriebssystem ab. Verwenden Sie Windows, Linux, Unix, OSX, BSD? Welche Version?
Terdon

Antworten:

20

In Rsync Version 3.1.0 wurden die Optionen --usermapund --groupmapgenau zu diesem Zweck eingeführt. Siehe die Manpage .

Michel Schinz
quelle
Das ist gut zu wissen. Hierfür gibt es definitiv ein Anwendungsfall-Szenario. Zum Beispiel habe ich zwei Icinga-Server und muss eine Einweg-Synchronisierung der Konfigurationsdateien von Master zu Slave durchführen. Aber Icinga auf dem Master ist eine andere UID als Icinga auf dem Sklaven. Gut zu wissen, dass rsync damit umgehen kann.
Michael Martinez
Versionshinweise: Ubuntu v16.04 hat v3.1.1, CentOS 7 hat v3.1.2, aber CentOS 6 hat v3.0.6. Dies funktioniert hervorragend für neuere Distributionen.
Jimp
4

In der letzten Version (mindestens 3.1.1) von rsync können Sie den "Remote-Besitz" angeben:

--usermap=tom:www-data

Ändert den Besitz von Tom in WWW-Daten (auch bekannt als PHP / Nginx). Wenn Sie Mac als Client verwenden, verwenden Sie Brew, um auf die letzte Version zu aktualisieren. Laden Sie auf Ihrem Server Archivquellen herunter und "machen" Sie es dann!

Thomas Decaux
quelle
für mich funktioniert es als --chown = tom: www-data
Federico Galli
0

Wenn Sie den Besitz von Dateien auf beliebige Benutzer ändern möchten, müssen Sie sich zuerst im Zielfeld als Root befinden.

Ich glaube nicht, dass es eine solche Funktion gibt, die von rsync integriert wird, aber Sie können sie erreichen, indem Sie a ausführen, findnachdem Sie rsync ausgeführt haben.

Möglicherweise reicht ein Befehl wie dieser aus: Übersetzen Sie beispielsweise von UID 1000 => 505 und UID 1001 => 700:

find /your/rsynced/path -user 1000 -exec chown 505 {} \;
find /your/rsynced/path -user 1001 -exec chown 700 {} \;

Wenn Sie viele Benutzer haben, können Sie eine Schleife mit einer Zuordnung in Ihrer Vorliebe verwenden.

Habe Spaß.

Adrien M.
quelle
Ok, es gibt einfach keine Möglichkeit, rsync dazu zu bringen. Erstaunlicherweise schien es mir ein so offensichtliches Bedürfnis zu sein.
Matto
1
@matteo vorsichtig, wenn Sie dies verwenden. Wenn sich auf dem Remotecomputer ein Benutzer mit der ID 1000 oder 1001 befindet, befinden sich möglicherweise Dateien an den Remote-Standorten, deren rechtmäßiger Besitz ihnen gehört, und das Chowning kann zu Problemen führen.
Terdon
@terdon Wie würde es einen Benutzer ohne Namen auf dem Remote-Computer geben? (denn wenn die ID anstelle des Namens angezeigt wird, wenn Dateien aufgelistet werden, bedeutet dies, dass der Benutzer keinen Namen hat, oder?)
matteo
1
@matteo nein, jeder Benutzer hat eine Benutzer-ID sowie einen Namen. In den meisten Debian-basierten Systemen (und wahrscheinlich auch in anderen) ist der erste Standardbenutzer Benutzer 1000. Versuchen Sie, idauf Ihrem Computer zu arbeiten, um zu sehen. Wenn Sie die IDs wie folgt verwenden, gehen Sie daher davon aus, dass sich auf dem Remotecomputer kein Benutzer mit derselben ID befindet, und dies ist wahrscheinlich nicht der Fall.
Terdon
In meinem Fall befindet sich kein Benutzer mit UID 1000 auf dem Server, zumindest ist er nicht in / etc / passwd aufgeführt. Was ich vermutet habe, denn wenn ich Dateien mit "ls -la" aufliste, werden Dateien von 1000 (die das Ergebnis von rsync -avz von meinem lokalen Computer waren, auf dem Benutzer 1000 mein Standardbenutzer "teo" ist) mit "1000" angezeigt "als Eigentümer. Wenn es einen Benutzer mit dieser ID gäbe und der Name "Jemand" lautet, wird der Eigentümer der Dateien in der Ausgabe von ls als "Jemand" angezeigt, oder? Wie auch immer, das ist eine nützliche Einschränkung, danke.
Matto
-1

Ich bin nicht sicher, ob ich das verstehe. sshUm eine Verbindung herzustellen, müssen Sie einen Benutzernamen angeben. Dieser Benutzername ist Benutzer W auf dem Remotecomputer, der zur Gruppe Z gehört. Daher wird alles genau so übertragen, wie Sie es möchten:

rsync /path/to/local [email protected]/path/to/remote

BEARBEITEN als Antwort auf den Kommentar des OP.

Verwenden Sie diese Option nicht, wenn Sie diese Benutzerzuordnung durchführen und die Berechtigungseinstellungen nicht verlieren möchten -a. Führen Sie zunächst rsync mit aus [email protected], um den richtigen Benutzernamen zu erhalten. -aGeben Sie dann die Optionen manuell an , anstatt dass Sie das Eigentum behalten. Von man rsync:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
    -r, --recursive             recurse into directories
    -l, --links                 copy symlinks as symlinks
    -p, --perms                 preserve permissions
    -t, --times                 preserve modification times
    -g, --group                 preserve group
    -o, --owner                 preserve owner (super-user only)
    -D                          same as --devices --specials

Also, -aaktiviert alle oben genannten Optionen , aber Sie wollen nicht die Gruppe oder den Eigentümer zu bewahren. Dieser Befehl sollte tun, was Sie wollen:

rsync -rlptDvz /path/to/local [email protected]:/path/to/remote

Da Sie sich jetzt als anmelden mywwwund die Eigentümer- / Gruppeninformationen nicht mehr beibehalten, gehören die von erstellten Kopien rsyncdem mywwwBenutzer.

Terdon
quelle
Nein, ich mache rsync -avz / path / to / local [email protected]: / path / to / remote. Meine Frage ist, wie kann ich Dateien, die dem Benutzer "x" auf meinem lokalen Computer gehören, dem Benutzer "w" auf dem Server neu zuordnen? Auf meinem Computer gehören meine Dateien zu "teo". Auf dem Server gibt es nicht einmal einen Benutzer namens "teo". Der Benutzer muss derjenige sein, den Apache verwendet, z. B. "mywww". und das gleiche für die Gruppe. Standardmäßig versucht rsync, den Eigentümer als "teo" beizubehalten. Da es keinen solchen Benutzer gibt, wird die UID beibehalten, was zu Dateien des Benutzers "1000" führt, der auf dem Server nicht vorhanden ist
matteo
Übrigens muss ich gleichzeitig die Dateiberechtigungen beibehalten, die bereits gemäß der Option -a ausgeführt werden. Ich meine, jede Lösung, die mich die Fähigkeit verlieren lässt, Dateiberechtigungen beizubehalten (dh eine 777-Datei bleibt eine 777 und eine 600 bleibt eine 600), reicht nicht aus
matteo
@matteo Das liegt daran, -adass der Eigentümer und die Gruppenoptionen beibehalten werden. Siehe meine aktualisierte Antwort.
Terdon
1
@matteo bitte erklären Sie, was Sie tatsächlich brauchen, wenn Sie Fragen stellen. Auf diese Weise verschwenden wir keine Zeit mit unvollständigen Antworten. Denken Sie beim nächsten Mal daran, i) die tatsächlich verwendeten Befehle anzugeben (rsync behält standardmäßig nichts bei, Ihre Verwendung hat dies -agetan) ii) alle Einschränkungen, die Sie haben, klar zu erklären, Sie haben nur einen einzelnen Benutzer bis zu Ihrem letzten Kommentar erwähnt und iii ) Erwähnen Sie Ihr Betriebssystem. Wie auch immer, der Weg, dies zu tun, rsyncwäre, einen Satz von Dateien als mywww@remoteund den nächsten Satz als zu kopieren root@remote.
Terdon
1
@matteo was wirklich nicht klar war, war, dass Sie verwendet haben, -awas das Eigentum bewahrt. In den von Ihnen angegebenen Beispielen wurde vorgeschlagen, dass Sie dies nur für einen Benutzer tun müssen. Auf rsyncjeden Fall würde ich empfehlen, dass Sie einfach eine Liste der verschiedenen Dateien erstellen, die Sie für jeden Benutzer kopieren möchten, und mehrere rsyncs ausführen, die mit dem entsprechenden Benutzernamen eine Verbindung zum Remote-Computer herstellen. Das wird einfacher und sicherer.
Terdon