web-dev-qa-db-fra.com

Comment puis-je changer tous les fichiers appartenant à un utilisateur à un autre utilisateur?

Je recherche une commande Linux capable de modifier la propriété de tous les fichiers appartenant à un utilisateur donné, de préférence dans un répertoire ciblé, en un autre utilisateur spécifié.

La commande de mes rêves ressemblerait à quelque chose comme ça ...

chuser -R --olduser tom --newuser jerry

ou

chuser -R --olduser 1066 --newuser 1492

C'est mon scénario ... J'ai un fichier de sauvegarde (.tgz) dans lequel sont conservées les informations relatives aux utilisateurs et aux groupes. Il a été pris à partir d'un serveur Web exécutant Apache et MySQL. Les fichiers de la sauvegarde proviennent de l'ensemble du système et contiennent des fichiers de plusieurs utilisateurs différents et de plusieurs comptes de type de système. Il est essentiel que les paramètres ne soient pas perdus lors de la restauration sur le nouveau serveur. Le problème est que les utilisateurs sur la machine sur lesquels les fichiers sont en cours de restauration ne correspondent pas à ceux du fichier de sauvegarde. Par exemple, les deux machines ont un utilisateur MySQL, mais elles ont des identifiants différents et il existe plusieurs identifiants sur les deux machines appartenant à des utilisateurs différents. Cela signifie qu'il n'y a aucun moyen de synchroniser les utilisateurs de la nouvelle machine avec ceux de l'ancienne machine.

Je peux trouver tous les fichiers utilisateurs avec la commande find comme ceci ...

find /decompressed-backup-dir -uid 1050

ou

find /decompressed-backup-dir -user tom

Si, comme je le soupçonne, il n’ya aucun moyen de faire ce que je veux avec une seule commande, alors peut-être qu’il existe un moyen de diriger les résultats de la commande find vers une autre commande pour gérer le changement de propriété?

Je pourrais le faire avec un script PHP mais il y a 4 Go et des dizaines de milliers de fichiers dans la sauvegarde, donc je ne veux pas utiliser PHP ou Perl, mais je serais heureux avec un script shell qui pourrait le gérer.

37
Night Owl

Quelque chose comme

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
26
Ben Voigt

Je pense que la commande --from flag on chown est probablement le moyen le plus simple.

chown --from=oldguy newguy * -R
61
SiteKickr

Vous pouvez utiliser find, comme quelqu'un l’a posté, pour faire chown.

Cependant, vous n’aurez peut-être pas à le faire car tar prendra soin de tout.

Par exemple, si vous faites un tar sur machine A où user tom est uid 500, puis untar le fichier sur machine B où user tom est uid 505, tar fera ce qu'il faut et fera en sorte que les fichiers soient possédés par uid 505.

6
Ciclamino

En ajoutant à la réponse de SiteKickr , chgrp n'a pas l'argument --from, mais vous pouvez obtenir la même chose avec chown en omettant l'utilisateur.

Exemple:

chown -R --from=:currentgroup :newgroup /some/directory
6
TheBigB

La réponse définit à la fois l'utilisateur et le groupe:

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +

mais si vous voulez changer SEULEMENT le groupe de fichiers qui appartient à un utilisateur, vous ne pouvez pas utiliser chown (pour autant que je sache), mais utilisez plutôt chgrp:

find /decompressed-backup-dir -uid 1050 -exec chgrp newgroup {} +

et pour changer SEULEMENT le groupe de fichiers qui appartient à un groupe que vous devez utiliser, par exemple:

find /decompressed-backup-dir -gid 400 -exec chgrp newgroup {} +

Juste pour ajouter des connaissances.

1
Timo Kähkönen

Si vous avez besoin de mapper de manière récursive les anciens/nouveaux identifiants de propriété qui se résolvent vers le même utilisateur /etc/passwd,

(ce qui pourrait arriver après que vous ayez introduit LDAP sur le serveur et que /etc/passwd ait des entrées en double pour chaque utilisateur et groupe),

vous pouvez utiliser ce script, j'ai écrit: https://Gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Il crée lui-même le mappage. L'interface du programme est, malheureusement, dans le code. Ajoutez quelques instructions de débogage si vous devez rechercher comment il fait quoi. Mais c’est plutôt un chown glorifié avec un mappage créé à partir de doublons dans /etc/passwd. Si cela peut être utile à quiconque, ce serait vraiment cool. :)

0
galva