Rsync für Konfigurationsdateien: Nutzer/Gruppen mappen - mit passwd-Datei?

pseudopseudonym

Fleet Admiral
Registriert
Mai 2017
Beiträge
10.914
Servus!

Ich möchte mit Rsync Konfigurationsdateien übertragen. Das funktioniert an sich ganz gut, allerdings hat das neue System leider andere GIDs/UIDs, womit die Besitzer nicht mehr passen.
Wie kann man das am schönsten mappen, wenn man einen USB-Stick zum Übertragen nutzt (die Systeme haben keinen direkten Kontakt)?
Könnte man irgendwie die /etc/passwd des alten Systems nutzen?

Edit:
Inzwischen gelöst, steht weiter unten.
Bessere Lösungen sind dennoch willkommen.
 
Zuletzt bearbeitet:
-av kopiert aber exakt die IDs.
Und die sind auf den Systemen unterschiedlich. Kopiere ich also Dateien, die dem Nutzer "vdr" mit der ID 102 gehören, kann es sein, dass die Dateien auf dem neuen System dem Nutzer "ssh" mit der ID 102 gehören.
Genau das ist leider der Fall.
Müsste cp nicht das gleiche Problem haben?
Ergänzung ()

Zumindest, wenn man von einem PC auf einen Stick synct und dann vom Stick auf einen anderen PC.
 
Die Namen der User sind auf allen Systemen gleich? Normalerweise versucht rsync schon die User zu mappen auch wenn die uids verschieden sind. Nur wenn man den Parameter "--numeric-ids" verwendet, werden die uids und gids 1:1 kopiert. Kopierst du auch als root? Weil nur wenn rsync als root läuft können die Besitzer geändert werden, ansonsten ist der Besitzer am Ziel der unter dem rsync läuft.
 
cc_aero schrieb:
Die Namen der User sind auf allen Systemen gleich?
Nein, und genau da liegt das Problem.
Außerdem haben die Systeme keinen direkten Kontakt.

Meine einzige Idee wäre jetzt, die /etc/passwd mitzukopieren und ein Script zu bauen, das basierend auf dieser Datei die Optionen --mapuser und --mapgroup "ausfüllt", sodass es auf dem neuen System passt.

Achso: Ja, als root
 
Okay, wenn alles unterschiedlich ist, hast du schlechte Karten. Allerdings gibt's auch dafür Abhilfe. Du kannst rsync explizit als non-root ausführen und die Ausgabe von rsync so einstellen, daß er dir jedes kopierte Objekt + die originale uid und gid ausgibt. Diesen output fängst du auch und kannst somit nachträglich die User per shell script selbst mappen und die Besitzer entsprechend setzen.
Rsync muss als non-root laufen, da du sonst die gemappten id's rausbekommst und die dann auch gleich so gesetzt werden.
Genauso hab ichs unlängst auch bei einer größeren Migration gemacht, hat perfekt funktioniert.
 
So, hab mal zwei Scripte gebaut:
uidline.sh:
Code:
uidline=''
while read line
do
   IFS=':' read -r -a array <<< "$line"
   uidline="$uidline,${array[2]}:${array[0]}"
done < $1
uidline=${uidline:1}
echo "$uidline"

und gidline.sh:
Code:
gidline=''
while read line
do
   IFS=':' read -r -a array <<< "$line"
   gidline="$gidline,${array[3]}:${array[0]}"
done < $1
gidline=${gidline:1}
echo "$gidline"

Jetzt müsste ich die Dateien so aufs neue System kopieren können:
Code:
sudo rsync -avog --usermap="$(./uidline.sh passwd_quellensysytem)" --groupmap="$(./gidline.sh passwd_quellensysytem)" SOURCE TARGET

Anmerkungen? Tipps? Wetten?
Ergänzung ()

Das wäre wohl das Gesamtkonstrukt zum Kopieren aufs Zielsystem von einem USB-Stick:
Bash:
oldpasswd='der/pfad/zur/alten/passwd'

gidline=''
uidline=''
while read line
do
   IFS=':' read -r -a array <<< "$line"
   gidline="$gidline,${array[3]}:${array[0]}"
   uidline="$uidline,${array[2]}:${array[0]}"
done < $oldpasswd
gidline=${gidline:1}
uidline=${uidline:1}

sudo rsync -avog --delete --usermap="$uidline" --groupmap="$gidline" SOURCE TARGET
Ergänzung ()

Ha! Das funktioniert so!
Ich kann jetzt mit Rsync (ohne Usermap usw) die Konfigs und die passwd auf einen Stick kopieren, zu System2 laufen und dort die Configs so einspielen, dass die IDs/Nutzer passen.
 
Zuletzt bearbeitet:
Du könntest:
1. nachträglich auf das Zielverzeichnis rekursiv "chown -R .." und "chmod -R .." anwenden. (Ist aber langsam, weil das Verzeichnis neu durchlaufen werden muss. Und gefährlich wenn falsch angewendet.[->Jokerzeichen])
2. im Zielverzeichnis mit dem sgid-Flag arbeiten. (Das funktioniert aber nur bei neu erstellten, also kopierten aber nicht bewegten Dateien [auf derselben Partition]. COW-Filessysteme könnten bei gleichen Partitionen ebenso Probleme machen.)
3. "mount" anweisen einen Verzeichnispfad virtuell (rbind) auf ein anderes Verzeichnis neu zu mounten und alle ursprüngliche Masken zu ignorieren (uid,setuid,gid,setgid,mode).
4. "bindfs" verwenden, welches unfangreiche Manipulationen bei einem Mount-Remap anbietet. (Ist aber langsam im Zugriff.)
5. Eventuell ACL's einsetzen. (Nutze ich nicht, da zu exotisch.)
 
froschmeister schrieb:
1. nachträglich auf das Zielverzeichnis rekursiv "chown -R .." und "chmod -R .." anwenden. (Ist aber langsam, weil das Verzeichnis neu durchlaufen werden muss. Und gefährlich wenn falsch angewendet.[->Jokerzeichen])
Den Gedanken hatte ich auch, aber diese Config-Dateien haben unterschiedliche Nutzer. Ich müsste also vorher genau gucken, welche Datei welchen Nutzer hat.

froschmeister schrieb:
2. im Zielverzeichnis mit dem sgid-Flag arbeiten. (Das funktioniert aber nur bei neu erstellten, also kopierten aber nicht bewegten Dateien [auf derselben Partition]. COW-Filessysteme könnten bei gleichen Partitionen ebenso Probleme machen.)
3. "mount" anweisen einen Verzeichnispfad virtuell (rbind) auf ein anderes Verzeichnis neu zu mounten und alle ursprüngliche Masken zu ignorieren (uid,setuid,gid,setgid,mode).
4. "bindfs" verwenden, welches unfangreiche Manipulationen bei einem Mount-Remap anbietet. (Ist aber langsam im Zugriff.)
Es handelt sich hier um einen Haufen Datein, die unterschiedliche Besitzer und Rechte haben.
Würde ich das nicht zerstören bzw einen Einheitsbrei (bezogen auf Rechte und Nutzer) fabrizieren?
 
Zuletzt bearbeitet:
Zurück
Oben