Comment mapper arbitrairement les propriétés des utilisateurs / groupes dans rsync

17

J'ai besoin de rsync un répertoire sur un serveur distant afin que tous les fichiers appartenant à l'utilisateur X et au groupe Y sur la machine source (locale) soient mappés à l'utilisateur W et au groupe Z sur la machine de destination (distante). Si possible en utilisant ssh comme moyen de transport, mais si j'ai besoin d'utiliser le démon rsync, c'est bien aussi.

Y-a-t-il un moyen de faire ça? Je cherche un moyen d'établir une carte utilisateur / groupe arbitraire, telle que

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

Cela devrait être un cas d'utilisation assez courant, n'est-ce pas? Par exemple, j'ai des fichiers sur mon ordinateur local où mon nom d'utilisateur est X, et je dois les télécharger sur un serveur Web où ils doivent appartenir à un utilisateur donné qui n'a ni le même nom ni le même UID que mon utilisateur sur mon ordinateur personnel.

Je ne trouve pas cela sur la page de manuel de rsync ...

LINUX sur machine locale et distante (Ubuntu local, centOS distant)

Commande que j'ai essayée: rsync -avz / path / to / local [email protected]: / path / to / remote

matteo
la source
1
Veuillez toujours inclure votre système d'exploitation. Les solutions dépendent très souvent du système d'exploitation utilisé. Utilisez-vous Windows, Linux, Unix, OSX, BSD? Quelle version?
terdon

Réponses:

21

La version 3.1.0 de Rsync a introduit les options --usermapet --groupmapprécisément à cette fin. Voir la page de manuel .

Michel Schinz
la source
C'est bon à savoir. Il y a certainement un scénario d'utilisation pour cela. Par exemple, j'ai deux serveurs Icinga et je dois faire une synchronisation unidirectionnelle des fichiers de configuration du maître à l'esclave. Mais icinga sur le maître est un uid différent de icinga sur l'esclave. Donc, bon à savoir que rsync peut gérer cela.
Michael Martinez
Notes de version: Ubuntu v16.04 a v3.1.1, CentOS 7 a v3.1.2, mais CentOS 6 a v3.0.6. Cela fonctionne très bien pour les nouvelles distributions.
jimp
4

La dernière version (au moins 3.1.1) de rsync vous permet de spécifier la "propriété distante":

--usermap=tom:www-data

Change la propriété de Tom en www-data (aka PHP / Nginx). Si vous utilisez Mac en tant que client, utilisez brew pour passer à la dernière version. Et sur votre serveur, téléchargez les sources d'archives, puis "faites" ça!

Thomas Decaux
la source
pour moi cela fonctionne comme --chown = tom: www-data
Federico Galli
0

Si vous souhaitez changer la propriété des fichiers en utilisateurs arbitraires, vous devez d'abord être root sur la zone de destination.

Je ne pense pas qu'une telle fonctionnalité soit intégrée par rsync, mais vous pouvez y parvenir en exécutant a findaprès avoir fait votre rsync.

Peut-être qu'une commande comme celle-ci fera l'affaire: par exemple, traduisez depuis UID 1000 => 505 et UID 1001 => 700:

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

Si vous avez de nombreux utilisateurs, vous pouvez envisager d'utiliser une boucle avec un mappage, dans votre langage de prédilection.

S'amuser.

Adrien M.
la source
Ok donc il n'y a tout simplement pas de moyen pour que rsync fasse ça. Étonnant, cela me semblait un besoin si évident.
matteo
1
@matteo attention si vous l'utilisez. S'il y a un utilisateur avec l'ID 1000 ou 1001 sur la machine distante, il peut y avoir des fichiers qui leur appartiennent légitimement dans les emplacements distants et les endommager pourrait causer des problèmes.
terdon
@terdon comment pourrait-il y avoir un utilisateur sans nom sur la machine distante? (parce que si l'ID est affiché à la place du nom lorsque les fichiers sont répertoriés, cela signifie que l'utilisateur n'a pas de nom, non?)
matteo
1
@matteo non, chaque utilisateur a un identifiant ainsi qu'un nom. Dans la plupart des systèmes basés sur Debian (et probablement d'autres), le premier utilisateur par défaut est l'utilisateur 1000. Essayez de lancer idsur votre machine pour voir. Par conséquent, si vous utilisez des ID comme celui-ci, vous supposez qu'il n'y a aucun utilisateur avec le même ID sur la machine distante et ce n'est probablement pas vrai.
terdon
dans mon cas, il n'y a pas d'utilisateur avec UID 1000 sur le serveur, au moins il n'est pas répertorié dans / etc / passwd. C'est ce que j'ai deviné car lorsque je liste les fichiers avec "ls -la", les fichiers appartenant à 1000 (qui étaient le résultat de rsync -avz de ma machine locale où l'utilisateur 1000 est mon utilisateur par défaut "teo") apparaissent avec "1000 "en tant que propriétaire. S'il y avait un utilisateur avec cet identifiant, et que son nom était, disons "Quelqu'un", alors le propriétaire des fichiers serait affiché comme "Quelqu'un" dans la sortie de ls, non? Quoi qu'il en soit, c'est une mise en garde utile à prendre en compte, merci.
matteo
-1

Je ne suis pas sûr de comprendre, pour vous connecter, sshvous devez fournir un nom d'utilisateur. Ce nom d'utilisateur sera l'utilisateur W sur la machine distante qui appartient au groupe Z. Par conséquent, tout sera transféré exactement comme vous le souhaitez:

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

EDIT en réponse au commentaire du PO.

Si vous souhaitez effectuer ce mappage utilisateur et ne pas perdre les paramètres d'autorisations, n'utilisez pas -a. Tout d'abord, exécutez rsync avec [email protected]pour obtenir le bon nom d'utilisateur. Ensuite, au lieu de -ace qui vous fera conserver la propriété, spécifiez les options manuellement. De 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

Donc, -aactive toutes les options ci-dessus mais vous ne voulez pas conserver le groupe ou le propriétaire. Cette commande devrait faire ce que vous voulez:

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

Puisque vous vous connectez maintenant en tant que mywwwet ne conservez plus les informations sur le propriétaire / groupe, les copies effectuées par rsyncappartiendront à l' mywwwutilisateur.

terdon
la source
Non, je fais rsync -avz / path / to / local [email protected]: / path / to / remote. Ma question est, comment puis-je obtenir des fichiers appartenant à l'utilisateur "x" sur ma machine locale pour être remappés à l'utilisateur "w" sur le serveur? Sur mon ordinateur, mes fichiers appartiennent à "teo". Sur le serveur, il n'y a même pas d'utilisateur appelé "teo", j'ai besoin que l'utilisateur soit celui qu'apache utilise, disons "mywww"; et la même chose pour le groupe. Par défaut, rsync essaiera de conserver le propriétaire en tant que "teo", et comme il n'y a pas un tel utilisateur, il conservera l'UID, résultant en des fichiers appartenant à l'utilisateur "1000" qui est un utilisateur inexistant sur le serveur
matteo
Btw, en même temps, je dois conserver les autorisations de fichiers, ce qu'il fait déjà selon l'option -a. Je veux dire, toute solution qui me fera perdre la capacité de conserver les autorisations de fichiers (c'est-à-dire qu'un fichier 777 reste un 777 et un 600 reste un 600) ne fera pas l'affaire
matteo
@matteo c'est parce que -apermet de conserver les options de propriétaire et de groupe. Voir ma réponse mise à jour.
terdon
1
@matteo, veuillez expliquer ce dont vous avez réellement besoin lorsque vous posez des questions. De cette façon, nous ne perdons pas de temps à fournir des réponses incomplètes. La prochaine fois, n'oubliez pas i) d'inclure les commandes réelles que vous avez utilisées (rsync ne préserve rien par défaut, votre utilisation l'a -afait) ii) d'expliquer clairement toutes les contraintes que vous avez, vous venez de mentionner un seul utilisateur jusqu'à votre dernier commentaire et iii ) mentionnez votre système d'exploitation. Quoi qu'il en soit, la façon de procéder rsyncserait de copier un ensemble de fichiers en tant que mywww@remoteet l'ensemble suivant en tant que root@remote.
terdon
1
@matteo ce qui n'était vraiment pas clair, c'est que vous utilisiez -ace qui préserve la propriété. Les exemples que vous avez donnés suggèrent que vous ne deviez le faire que pour un seul utilisateur. Quoi qu'il en soit, je vous recommande d'utiliser rsync, faites simplement une liste des différents fichiers que vous souhaitez copier pour chaque utilisateur et exécutez plusieurs rsyncs se connectant à la machine distante avec le nom d'utilisateur approprié. Ce sera plus simple et plus sûr.
terdon