Wie kann ich alle Dateien eines Benutzers in einen anderen Benutzer ändern?

39

Ich suche nach einem Linux-Befehl, der den Besitz aller Dateien, die zu einem bestimmten Benutzer gehören, vorzugsweise in einem Zielverzeichnis, zu einem anderen angegebenen Benutzer ändern kann.

Mein Traumbefehl würde ungefähr so ​​aussehen ...

chuser -R --olduser tom --newuser jerry

oder

chuser -R --olduser 1066 --newuser 1492

Dies ist mein Szenario ... Ich habe eine Sicherungsdatei (.tgz), in der Benutzer- und Gruppeninformationen gespeichert sind. Es stammt von einem Webserver, auf dem Apache und MySQL ausgeführt werden. Die Dateien in der Sicherung stammen aus dem gesamten System und enthalten Dateien von mehreren verschiedenen Benutzern und mehreren Systemtypkonten. Es ist wichtig, dass die Einstellungen beim Wiederherstellen auf dem neuen Server nicht verloren gehen. Das Problem ist, dass die Benutzer auf dem Computer, auf dem die Dateien wiederhergestellt werden, nicht mit denen in der Sicherungsdatei übereinstimmen. Beispielsweise hatten beide Maschinen einen MySQL-Benutzer, aber sie haben unterschiedliche Benutzer-IDs, und es gab mehrere Benutzer-IDs, die auf beiden Maschinen vorhanden waren und unterschiedlichen Benutzern gehörten. Dies bedeutet, dass die Benutzer auf dem neuen Computer nicht mit denen auf dem alten Computer synchronisiert werden können.

Ich kann alle Benutzerdateien mit dem Befehl find wie folgt finden ...

find /decompressed-backup-dir -uid 1050

oder

find /decompressed-backup-dir -user tom

Wenn es, wie ich vermute, nicht möglich ist, mit einem einzelnen Befehl das zu tun, was ich will, gibt es vielleicht eine Möglichkeit, die Ergebnisse des Befehls find an einen anderen Befehl weiterzuleiten, um die Eigentümeränderung zu handhaben?

Ich könnte dies mit einem PHP-Skript tun, aber das Backup enthält 4 GB und Zehntausende von Dateien. Daher möchte ich weder PHP noch Perl verwenden, wäre aber mit einem Shell-Skript zufrieden, das damit umgehen kann.

Nachteule
quelle

Antworten:

30

So etwas wie

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Ben Voigt
quelle
1
stattdessen habe -uidich verwendet-user
alexandre1985
65

Ich denke, das Flag --from im Befehl chown ist wahrscheinlich der einfachste Weg.

chown --from=oldguy newguy * -R
SiteKickr
quelle
3
Beste Lösung, keine Notwendigkeit, Liebe zu finden
Tobias Hagenbeek
2
Optimale Lösung
Karl Forner
1
Unter OS X können Sie dies mit brew install coreutilsund tun gchown.
Domo
Dies ist die richtige und beste Antwort.
George M
Ich bestätige, es sollte als beste Antwort markiert werden.
Soullivaneuh
7

Hinzufügen zu der Antwort von SiteKickr , chgrphat nicht das --fromArgument, aber Sie können das gleiche mit erreichen, chownindem Sie den Benutzer weglassen.

Beispiel:

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

Sie können find, wie jemand anders geschrieben hat, das tun chown.

Möglicherweise müssen Sie sich jedoch nicht tarum alles kümmern.

Zum Beispiel, wenn Sie einen tarauf machine Adem Benutzer tomist uid 500und dann untardie Datei auf machine Bdem Benutzer tomist uid 505, tarwird das Richtige tun und machen die Dateien im Besitz uid 505.

Ciclamino
quelle
Interessanter Leckerbissen, das war mir nicht bewusst. Daher speichert tar nicht nur die UID, sondern auch den Namen, der mit der UID verknüpft ist.
Nicholi
3
Das ursprüngliche Teerformat speicherte nur die numerischen Informationen. Das von POSIX Ende der 80er Jahre eingeführte UStar-Format fügt die Namen hinzu. So ziemlich jeder Teer, dem Sie heutzutage begegnen, tut das Richtige.
Ciclamino
1

Die Antwort setzt sowohl Benutzer als auch Gruppe:

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

aber wenn du NUR eine Gruppe von Dateien ändern willst, die zu einem bestimmten Benutzer gehört, kannst du chown(soweit ich weiß) nicht verwenden, sondern stattdessen Folgendes verwenden chgrp:

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

und um NUR eine Gruppe von Dateien zu ändern, die zu einer Gruppe gehören, müssen Sie zB Folgendes verwenden:

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

Nur um Wissen hinzuzufügen.

Timo Kähkönen
quelle
1
Eigentlich kann man das newuserTeil einfach weglassen . Die Manpage sagt: "Wenn der Doppelpunkt und die Gruppe angegeben werden, der Eigentümer jedoch weggelassen wird, wird nur die Gruppe der Dateien geändert. In diesem Fall wird chowndie gleiche Funktion ausgeführt wie chgrp."
Ben Voigt
0

Wenn Sie die alten / neuen Besitz-IDs, die auf denselben /etc/passwdBenutzer aufgelöst werden , rekursiv zuordnen müssen ,

(Dies kann passieren, nachdem Sie LDAP auf dem Server eingeführt haben und /etc/passwddoppelte Einträge für jeden Benutzer und jede Gruppe haben.)

Sie könnten dieses Skript verwenden, das ich geschrieben habe: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Es erstellt das Mapping selbstständig. Die Oberfläche des Programms befindet sich leider im Code. Fügen Sie einige Debug-Anweisungen hinzu, wenn Sie untersuchen müssen, wie dies funktioniert. Aber es ist so ziemlich ein verherrlichter Chown mit einer Zuordnung, die aus Duplikaten in erstellt wurde/etc/passwd . Wenn dies jemals jemandem von Nutzen sein sollte, wäre das wirklich cool. :)

Galva
quelle
-2

Sie können verwenden chown - R /directory/file

Dieser Befehl ändert die Berechtigung für alle Instanzen des Verzeichnisses chown - R /directory

Mansur
quelle