===================================================================== Anleitung zur Umstellung der Benutzer- und Gruppen-ID-Nummern ===================================================================== =================== Inhaltsverzeichnis: =================== 0. Einleitung 1. Erstellen einer neuen passwd- und group-Datei 1.1 getpwgr 1.1.1 Fehlermeldungen und Warnungen 1.1.2 "Handarbeiten" 1.2 checkpwgr 1.2.1 Fehlermeldungen und Warnungen 1.2.2 Zusammenfassung 1.3 disjoin 1.3.1 Hinweise zur Benutzung 1.3.2 Abgleich zweier passwd-Dateien 1.3.3 Anwendung bei der Ueberarbeitung der neuen passwd-Datei 2. Erstellen der Parameterdateien 3. Umstellung des Filesystems (migid) 3.1 Fehlermeldungen 3.2 Warnungen 4. "Scharfmachen" der neuen passwd- und group-Datei X. Tool-Uebersicht 0. Einleitung ------------- Die Umstellung der Benutzer- und Gruppen-ID-Nummern wird notwendig, wenn wir die Geschaeftsstellen von sd&m mit einem WAN verbinden wollen, so dass man sich direkt auf allen Servern von sd&m einloggen und sogar Verzeichnisse eines beliebigen sd&m-Servers bei sich lokal mounten kann. Damit es keine Ueberschneidungen in den ID-Nummern der Benutzer und Gruppen gibt, wurde von Ralf Engelschall und Roland Handl ein Konzept erarbeitet, das jeder Geschaeftsstelle einen eigenen Nummernbereich zuordnet. (Dieses Konzept ist im TI-Gruppenverzeichnis im Unterverzeichnis "adm" unter dem Namen "uidgid.txt" zu finden - dieses Gruppenverzeichnis sollte uebrigens durch das "titx"-Tool in allen Geschaeftsstellen verfuegbar sein. Falls nicht, kann man es auch auf der SUN (BI) unter "/g/ti/" finden.) Im folgenden noch einmal die Essenz dieses Konzepts: predefined by local UNIX system: -----UID----- -----GID----- -------used for--------------------- 0 - 4999 0 - 4999 predefined by local UNIX system special user: -----UID----- -----GID----- -------used for--------------------- 5000 - 5249 5000 - 5249 sd&m Muenchen (MUC BI) 5250 - 5499 5250 - 5499 sd&m Muenchen (MUC BI) 5500 - 5749 5500 - 5749 sd&m Muenchen (MUC FI) 5750 - 5999 5750 - 5999 sd&m Muenchen (MUC FI) 7000 - 7249 7000 - 7249 sd&m Ratingen (RAT) 7500 - 7749 7500 - 7749 sd&m Frankfurt (FFM) 8000 - 8249 8000 - 8249 sd&m Hamburg (HH) real user: -----UID----- -----GID----- -------used for--------------------- 10000 - 10249 sd&m Muenchen (MUC BI) 10250 - 10499 sd&m Muenchen (MUC BI) 10500 - 10749 sd&m Muenchen (MUC FI) 10750 - 10999 sd&m Muenchen (MUC FI) 12000 - 12249 sd&m Ratingen (RAT) 12500 - 12749 sd&m Frankfurt (FFM) 13000 - 13249 sd&m Hamburg (HH) real group-user and group: -----UID----- -----GID----- -------used for--------------------- 20000 - 20249 20000 - 20249 sd&m Muenchen (MUC BI) 20250 - 20499 20250 - 20499 sd&m Muenchen (MUC BI) 20500 - 20749 20500 - 20749 sd&m Muenchen (MUC FI) 20750 - 20999 20750 - 20999 sd&m Muenchen (MUC FI) 22000 - 22249 22000 - 22249 sd&m Ratingen (RAT) 22500 - 22749 22500 - 22749 sd&m Frankfurt (FFM) 23000 - 23249 23000 - 23249 sd&m Hamburg (HH) reserved: -----UID----- -----GID----- -------used for--------------------- 30000 - 32767 30000 - 32768 reserved unused for compatibility reasons: -----UID----- -----GID----- -------used for--------------------- 32768 - 65535 32768 - 65535 unused for compatibility reasons Die Umstellung selbst erfolgt in vier Schritten: 1. - Erstellen einer neuen passwd- und group-Datei entsprechend dem obigen Konzept 2. - Erstellen zweier Parameterdateien, die das Programm zur Umstellung der Besitzernummern in allen Dateien des Filesystems steuern 3. - Umstellung der Besitzernummern in allen Dateikoepfen in allen Dateien des gesamten Filesystems 4. - "Scharfmachen" der im ersten Schritt erstellten neuen passwd- und group-Dateien Die ersten drei Schritte werden dabei jeweils durch Werkzeuge unterstuetzt; der vierte Schritt ist trivial. Diese Werkzeuge haben folgende Namen (alphabetisch sortiert, nicht nach Funktionszusammenhang): checkpwgr copypwgr disjoin freeids getpwgr idcopy makeidfile migid pwadjust sortpwgr Von diesen zehn Werkzeugen sind zwei (makeidfile, sortpwgr) triviale Filter, die mehr als Gedaechtnisstuetze denn als ausgefeilte Werkzeuge dienen (ein Auflisten mit "more" dieser zwei Filter wird dies zeigen!). Das Werkzeug "pwadjust" ist ebenfalls mehr eine Gedaechtnisstuetze; es enthaelt einfach nur die Befehle, die sonst zum Abgleich von zwei passwd- Dateien von Hand eingegeben werden muessten (siehe Abschnitt 1.3.2). Bis auf freeids, makeidfile, pwadjust und sortpwgr geben uebrigens alle diese Werkzeuge beim Aufruf ohne Parameter oder einem Parameter "-h" oder "-?" eine Hilfe-Seite aus. In den folgenden Kapiteln werden diese Werkzeuge und die oben genannten Schritte erlaeutert. Die Nummer eines Kapitels entspricht dabei der Nummer eines der obigen vier Schritte. 1. Erstellen einer neuen passwd- und group-Datei ------------------------------------------------ Wie in dem eingangs erwaehnten Konzept ("uidgid.txt") erlaeutert wird, gibt es auf jedem UNIX-System einige vom System vorgegebene User, die fuer das Funktionieren des Systems erforderlich sind, wie z.B. root, uucp, sync, bin, usw. Die Nummern, die diesen Usern zugeordnet sind, sind meist fest vorgegeben, z.B. "0" fuer "root". Zusaetzlich zu diesen vorgegebenen System-Usern gibt es aber oft auch noch eine ganze Reihe spezieller User, die nur der Verwaltung bestimmter Dienste dienen, z.B. Datenbanken, Projekt-Bibliotheken, Projekt-Gateways zu Kunden, Terminal-Emulierungs-Software, und so fort. Diese werden im folgenden mit "Spezielle User" oder "Spezielle Benutzer" bezeichnet. Von diesen Speziellen Benutzern werden noch einmal die sogenannten "Gruppen- User" oder "Gruppen-Benutzer" unterschieden, die meist jedes Projekt-Team einrichtet und benutzt. Diese Gruppen-Benutzer haben denselben Namen wie die Gruppe selbst und auch die selbe Gruppen-ID-Nummer (GID). Das neue Konzept sieht zusaetzlich vor, dass fuer Gruppen-User auch die User-ID-Nummer (UID) mit der Gruppen-ID-Nummer (GID) uebereinstimmt - was bisher nicht immer der Fall war. Und schliesslich gibt es noch die "echten" Benutzer - sozusagen die "physischen" im Gegensatz zu den oben beschriebenen "juristischen" Personen. Diese werden im folgenden als "Normale" Benutzer oder User bezeichnet. Fuer jede dieser Arten von Benutzern gibt es in dem neuen Konzept eigene Nummernbereiche, die zudem von Geschaeftsstelle zu Geschaeftsstelle variieren. 1.1 getpwgr ----------- Da das Umaendern der User- und Gruppen-ID-Nummern in der /etc/passwd- und der /etc/group-Datei unter Beachtung dieses Konzepts sehr muehsam und fehlertraechtig ist, wurde dies so weit es irgend ging automatisiert. Eine zusaetzliche Schwierigkeit stellt das NIS-System (auch als "Yellow Pages" bekannt) dar, bei dem die passwd- und die group-Datei in mehrere Teile aufgeteilt und an verschiedenen Stellen im Filesystem abgelegt ist. Das entsprechende Software-Werkzeug ist jedoch in der Lage, durch System- Aufrufe vom Vorhandensein oder Nichtvorhandensein des NIS-Systems zu abstrahieren, was einen weiteren Vorteil bei der Verwendung eines Werkzeugs (gegenueber der Bearbeitung von Hand) darstellt. Das Werkzeug, das die Erstellung der neuen passwd- und group-Datei vornimmt, heisst "getpwgr"; wobei "pw" fuer "passwd" und "gr" fuer "group" steht. Beim Aufruf muss man ihm mittels einer der Optionen "-hh", "-rat", "-ffm" "-bi" oder "-fi" mitteilen, welche Nummernbereiche von welcher Geschaefts- stelle bei der Umsetzung zugrundegelegt werden sollen. Die Umsetzung der Benutzer- und Gruppen-ID-Nummern erfolgt dabei durch einfache Addition der aktuellen ID zu dem Basiswert des entsprechenden Nummernbereichs fuer die betreffende Geschaeftsstelle und den Typ des Benutzers (Spezieller, Normaler oder Gruppen-Benutzer). Wahlweise kann man auch Pfad und Namen der beiden Dateien bestimmen, in denen das Ergebnis abgelegt wird. Defaultmaessig wird "/g/sysadm/etc.passwd.new" und "/g/sysadm/etc.group.new" verwendet. Die Ausgaben des Programms auf STDERR sollte man in einem Log-File auffangen, da man diese gleich anschliessend dringend benoetigt. Ein Aufruf koennte beispielsweise wie folgt aussehen: getpwgr -rat 2>getpwgr.log Die Ausgaben des Programms auf STDOUT wuerden dann wie folgt aussehen: > > 'getpwgr' Version 1.0.1 active parameters: > > New passwd file name = '/g/sysadm/etc.passwd.new' > New group file name = '/g/sysadm/etc.group.new' > Site = 'Ratingen' > > Done. > 1.1.1 Fehlermeldungen und Warnungen ----------------------------------- In dem oben erwaehnten Log-file koennen (falls nicht ein die Eingangsparameter betreffender fataler Fehler vorgelegen hat) Fehlermeldungen und Warnungen der folgenden Form vorkommen (Numerierung nur hier eingefuegt fuer Rueckbezuege in diesem Text): 1: Error: Group name '' is not unique! 2: Warning: Group id '' is not unique! 3: Warning: Group '' has GID < min ( < )! 4: Warning: Group '' has GID > max ( > )! 5: Error: User name '' is not unique! 6: Warning: User id '' is not unique! 7: Warning: User '' belongs to non-existent group ''! 8: Warning: User '' has UID < min ( < )! 9: Warning: User '' has UID > max ( > )! 10: Warning: User '' has GID < min ( < )! 11: Warning: User '' has GID > max ( > )! 12: Warning: Group user '' has UID <> GID ( <> )! 13: Warning: Group user '' is not contained in group ''! Die beiden Fehler mit den Nummern 1 und 5 1: Error: Group name '' is not unique! 5: Error: User name '' is not unique! sind fatale Fehler und fuehren zum sofortigen Programmabbruch: Ein Login- Kuerzel wurde mehrmals vergeben! Dies sollte schnellstens behoben werden, bevor man mit der Umstellung fortfaehrt! (Danach ist das "getpwgr"-Tool erneut aufzurufen.) Die Warnungsmeldungen 2 und 6 2: Warning: Group id '' is not unique! 6: Warning: User id '' is not unique! koennen auf einen Fehler hindeuten, falls es sich um einen normalen Benutzer bzw. eine normale Gruppe handelt. Bei System-Benutzern wie "root" usw. kann dies aber auch beabsichtigt sein. Ein Systemadministrator duerfte das aber in der Regel anhand des Namens sofort entscheiden koennen. Falls ein Versehen vorliegt, muss dem/der (den) anderen Benutzer(n)/Gruppe(n) mit der selben ID eine neue ID gegeben werden. Dazu ruft man das Tool "freeids" (ohne Parameter) auf, welches eine Liste der auf dem System noch freien UIDs und GIDs ausgibt. Anschliessend setzt man die gewaehlte Nummer von Hand um und traegt sie in "/g/sysadm/etc.passwd.new" bzw. "/g/sysadm/etc.group.new" ein. Die Warnungsmeldungen 3, 4, 8, 9, 10 und 11 3: Warning: Group '' has GID < min ( < )! 4: Warning: Group '' has GID > max ( > )! 8: Warning: User '' has UID < min ( < )! 9: Warning: User '' has UID > max ( > )! 10: Warning: User '' has GID < min ( < )! 11: Warning: User '' has GID > max ( > )! bedeuten, dass eine ID-Nummer ausserhalb des fuer die Geschaeftsstelle vorgesehenen Bereichs liegt und von Hand in der Datei "/g/sysadm/etc.passwd. new" bzw. "/g/sysadm/etc.group.new" (bzw. den gewaehlten) korrigiert werden muss. Auch hier kann wieder das Tool "freeids" eingesetzt werden, um noch freie UIDs bzw. GIDs zu ermitteln (die dann von Hand umgesetzt werden muessen). Die Warnung 7 7: Warning: User '' belongs to non-existent group ''! weist darauf hin, dass der angegebene Benutzer eine GID besitzt, zu der in der group-Datei des Systems keine entsprechende Gruppe existiert. Das kann darauf zurueckzufuehren sein, dass bei diesem Benutzer versehentlich eine falsche GID eingetragen wurde, oder dass versehentlich die Gruppe, zu der dieser Benutzer gehoert, aus der group-Datei des Systems geloescht wurde. Der Systemadministrator sollte diese Frage klaeren und entweder die GID in der passwd-Datei des Systems korrigieren oder die entsprechende Gruppe in der group-Datei des Systems eintragen, und dann das "getpwgr"-Tool erneut starten. Die Warnung 12 12: Warning: Group user '' has UID <> GID ( <> )! besagt, dass ein Benutzer, der offenbar Gruppen-User ist, eine von der GID verschiedene UID besitzt, was nach dem neuen Konzept nicht zugelassen ist. Diese Warnung bedeutet, dass in der Datei "/g/sysadm/etc.passwd.new" die UID dieses Benutzers mit seiner GID ueberschrieben wurde. Falls es sich bei diesem Benutzer aber nicht um einen Gruppen-User handeln sollte, muss dies wieder rueckgaengig gemacht werden. Dazu muss der Wert der UID aus dieser Meldung entnommen, von Hand umgesetzt und in der neuen passwd- Datei eingetragen werden. Die Meldung 13 13: Warning: Group user '' is not contained in group ''! schliesslich bedeutet, dass der Gruppen-User in seiner eigenen Gruppe nicht als Mitglied eingetragen ist - was vielleicht Absicht sein koennte, wahr- scheinlich aber einfach ein Versehen ist und behoben werden sollte (in "/g/sysadm/etc.group.new"). 1.1.2 "Handarbeiten" -------------------- Auch wenn das Tool ohne eine einzige Fehlermeldung oder Warnung durchge- laufen sein sollte (herzlichen Glueckwunsch!!), muss an die Datei "/g/sysadm/etc.passwd.new" (im Normalfall jedoch nicht an "/g/sysadm/etc.group.new"!) noch "Hand angelegt" werden: Das Tool ist naturgemaess nicht in der Lage, zwischen Speziellen und Normalen sowie System-Benutzern zu unterscheiden. Nur Gruppen-User koennen mit grosser Trefferwahrscheinlichkeit erkannt werden (aber auch hier sollte man kontrollieren!). Aus diesem Grunde werden in diese Datei zuerst alle erkannten Gruppen-User geschrieben. Im Gegensatz zu Speziellen, Normalen und System-Benutzern erscheinen Gruppen-User in dieser Datei nur ein einziges Mal. Jeder andere Benutzer kommt jedoch zweimal vor: einmal als Spezieller sowie einmal als Normaler Benutzer - mit entsprechend unterschiedlicher UID! Die Aufgabe des Administrators besteht nun darin, jeden Benutzer in die richtige Kategorie einzuordnen - genauer gesagt: Benutzer, die in eine der beiden Kategorien nicht hineingehoeren, werden dort, wo sie fehl am Platze sind, geloescht (es wird einfach die entsprechende Zeile geloescht). Zusaetzlich muss bei System-Benutzern die Umsetzung der UID (moeglicherweise auch der GID) rueckgaengig gemacht werden, was aber aufgrund der einfachen Umsetzungsvorschrift (Addition der UID mit dem Basiswert des Benutzertyps und der Geschaeftsstelle) besonders leicht zu bewerkstelligen geht: Man nimmt den Wert einfach modulo 100. (Bei System-Benutzern ist es daher egal, ob man sie bei den Speziellen oder den Normalen Benutzern einordnet - um Irrtuemer auszuschliessen, sollte man sich aber konsequent fuer eines von beiden entscheiden!) Als einziger System-Benutzer wird "root" (UID = 0) erkannt und von der Umsetzung verschont. Er wird in der Kategorie "Spezielle Benutzer" abgelegt. Ebenso werden auch alle Gruppen mit der GID = 0 von der Umsetzung ausgenommen. Sollte einer der Benutzer in den beiden Kategorien Spezieller oder Normaler Benutzer ein Gruppen-Benutzer sein (was theoretisch nur vorkommen kann, wenn sich der Name des Gruppen-Users vom Namen der Gruppe oder die GID des Gruppen- Users von der GID der Gruppe unterscheidet), so muss die GID in den Nummern- bereich fuer Gruppen transformiert werden und die UID muss mit dieser neuen GID ueberschrieben werden. Ausserdem sollte man sich ueberlegen, ob man nicht doch den Namen (oder die GID!) der entsprechenden Gruppe verwenden sollte! Sollte einer der Benutzer, die automatisch als Gruppen-User eingeordnet wurden, kein solcher sein, ist von Hand die urspruengliche UID zu suchen und in den richtigen Bereich (System-, Spezieller oder Normaler Benutzer) umzusetzen. Die GID wird in aller Regel ja trotzdem stimmen. Ganz zum Schluss werden die Zeilen, die in der Datei "/g/sysadm/etc.passwd. new" jeweils vor den drei Benutzer-Kategorien Gruppen-User, Spezieller und Normaler User eingefuegt sind, entfernt: ---------------------------------------------------------------------- Gruppen-User: (Alle Nicht-Gruppen-User in die richtige Kategorie verschieben!) ---------------------------------------------------------------------- ---------------------------------------------------------------------- Spezielle User (z.B. fuer Gateways etc.): (Alle Normalen User von Hand entfernen!) ---------------------------------------------------------------------- ---------------------------------------------------------------------- Normale User (also alle physischen Personen): (Alle Speziellen User von Hand entfernen!) ---------------------------------------------------------------------- Wahlweise kann man nun noch die beiden Dateien "/g/sysadm/etc.passwd.new" und "/g/sysadm/etc.group.new" nach den UIDs bzw. GIDs aufsteigend sortieren. Dazu verwendet man den Filter "sortpwgr", der einfach nur das UNIX "sort"- Kommando mit den entsprechenden Parametern enthaelt: sortpwgr /g/sysadm/etc.passwd.sorted sortpwgr /g/sysadm/etc.group.sorted 1.2 checkpwgr ------------- Hat man dann alle diese Schwierigkeiten gemeistert, ist wahrscheinlich das Verlangen gross zu wissen, ob man sich nicht irgendwo vertan hat. Dazu gibt es das Tool "checkpwgr", das nach Abschluss der manuellen Aufraeum- aktion aufgerufen werden kann (und sollte). Es wird mit derselben Option zur Bestimmung der Geschaeftsstelle aufgerufen wie auch das "getpwgr"-Tool. Das Programm benutzt defaultmaessig die Namen der beiden Dateien, die vom "getpwgr"-Tool erzeugt werden, als Namen fuer seine zwei Eingabedateien (also "/g/sysadm/etc.passwd.new" und "/g/sysadm/etc.group.new"). Diese koennen jedoch auch mit Hilfe der "-p"- und der "-g"-Option frei gewaehlt werden (genaueres hierzu siehe in der Hilfe-Seite, die durch den Aufruf von "checkpwgr" ohne Parameter oder mit Parameter "-h" oder "-?" ausgegeben wird). Die Ausgaben des Programms sollten wieder in einer Datei aufgefangen werden; das Programm gibt (ausser bei Fehlern, die die Eingabeparameter betreffen) seine Diagnosen allerdings (im Unterschied zu "getpwgr") auf STDOUT (!) aus. Ein Aufruf koennte also beispielsweise wie folgt aussehen: checkpwgr -rat >checkpwgr.log 1.2.1 Fehlermeldungen und Warnungen ----------------------------------- Soweit keine Fehler bei den Eingabeparametern vorliegen, koennen die folgenden Fehlermeldungen und Warnungen in der Ausgabe auftreten: 1: Warning: Group id '' is not unique! 2: Warning: Group name '' is not unique! 3: Error: Group name '' is not unique! 4: Warning: Group name '' didn't exist before! 5: Error: Group '' has GID '' outside range (%d..%d) 6: Warning: User id '' is not unique! 7: Warning: User name '' is not unique! 8: Error: User name '' is not unique! 9: Warning: User name '' didn't exist before! 10: Error: User '' belongs to non-existent group ''! 11: Error: Group user '' has UID <> GID ( <> )! 12: Error: Group user '' has UID '' outside range (%d..%d) 13: Error: Group user '' has GID '' outside range (%d..%d) 14: Error: Special user '' has GID '' outside range (%d..%d) 15: Error: Normal user '' has GID '' outside range (%d..%d) 16: Error: User '' has UID '' outside range (%d..%d, %d..%d) 17: Error: User '' has GID '' outside range (%d..%d) 18: Error: Group '' is missing! 19: Error: User '' is missing! Hinweis: Im Gegensatz zu "getpwgr" wird bei "checkpwgr" nicht geprueft, ob ein Gruppen-User in seiner Gruppe auch explizit enthalten ist (d.h., nicht nur die GID dieser Gruppe besitzt, sondern auch in der Liste der Mitglieder dieser Gruppe ausdruecklich vorkommt), da dies fuer die Umstellung nicht relevant ist. Daher gibt es bei "checkpwgr" auch keine Meldung der Art: Warning: Group user '' is not contained in group ''! Diese Meldung wird nur von "getpwgr" ausgegeben. Dennoch sollte geprueft werden, ob die Eintragung des Gruppen-Users in seiner eigenen Gruppe nicht doch sinnvoll, sauberer oder gar erforderlich ist! Die Warnungen 1 und 6 1: Warning: Group id '' is not unique! 6: Warning: User id '' is not unique! bedeuten, dass eine Benutzer-ID-Nummer bzw. eine Gruppen-ID-Nummer mehrfach vergeben wurde. Das kann bei speziellen (System-) Benutzern oder Gruppen (wie z.B. "root") beabsichtigt sein, ist aber in der Regel ein Hinweis darauf, dass bei der manuellen Umsetzung ein Fehler unterlaufen ist, den es zu korrigieren gilt! Die Meldungen 2,3: Group name '' is not unique! 7,8: User name '' is not unique! gibt es (im Unterschied zu "getpwgr") einmal als Warnung (2, 7) und einmal als Fehlermeldung (3, 8). Die WARNUNG besagt, dass der angegebene Benutzer/die angegebene Gruppe zweimal vorkommt, jedoch beidesmal mit IDENTISCHER UID/GID. Eine der beiden Zeilen in "/g/sysadm/etc.passwd.new" bzw. "/g/sysadm/etc. group.new" fuer diesen Benutzer/diese Gruppe muss also geloescht werden. Die FEHLERMELDUNG besagt, dass der angegebene Benutzer/die angegebene Gruppe mehrmals vorkommt, und zwar mit UNTERSCHIEDLICHER UID/GID. Im Falle eines Benutzers deutet das darauf hin, dass vergessen wurde, diesen Benutzer aus der Liste der Speziellen oder der Normalen Benutzer zu entfernen. Auf jeden Fall _MUSS_ die Eindeutigkeit der Benutzer- und Gruppen-Namen sichergestellt werden! Die beiden Dateien "/g/sysadm/etc.passwd.new" und "/g/sysadm/etc.group.new" sind solange zu korrigieren, bis diese Meldungen (2, 3, 7, 8) beim Aufruf von "checkpwgr" nicht mehr auftreten! Die Warnungen 4 und 9 4: Warning: Group name '' didn't exist before! 9: Warning: User name '' didn't exist before! besagen, dass in der Datei "/g/sysadm/etc.passwd.new" bzw. "/g/sysadm/etc. group.new" ein Benutzer/eine Gruppe auftritt, der/die dem System unbekannt (d.h. in der zu diesem Zeitpunkt aktiven passwd- bzw. group-Datei nicht vorhanden) ist. Das kann gewollt sein oder auf einen Fehler hinweisen. Moeglicherweise wurde nach Erstellung von "/g/sysadm/etc.passwd.new" und "/g/sysadm/etc.group.new" ein Benutzer oder eine Gruppe aus der aktuell aktiven passwd- bzw. group-Datei entfernt! Die Fehlermeldung 10 10: Error: User '' belongs to non-existent group ''! zeigt an, dass eine Gruppe mit der GID, die bei dem angegebenen Benutzer eingetragen ist, in der Datei "/g/sysadm/etc.group.new" nicht existiert. Ich kann mir nicht vorstellen, dass das gewollt ist! Die Fehlermeldung 11 11: Error: Group user '' has UID <> GID ( <> )! besagt, dass ein Gruppen-Benutzer eine von der GID verschiedene UID besitzt, was nach dem neuen Konzept nicht zugelassen ist. Abhilfe: Die UID dieses Benutzers ist mit seiner GID zu ueberschreiben. Die Fehlermeldungen 5, 12, 13, 14, 15, 16 und 17 5: Error: Group '' has GID '' outside range (%d..%d) 12: Error: Group user '' has UID '' outside range (%d..%d) 13: Error: Group user '' has GID '' outside range (%d..%d) 14: Error: Special user '' has GID '' outside range (%d..%d) 15: Error: Normal user '' has GID '' outside range (%d..%d) 16: Error: User '' has UID '' outside range (%d..%d, %d..%d) 17: Error: User '' has GID '' outside range (%d..%d) bedeuten, dass die UID/GID eines Benutzers bzw. einer Gruppe ausserhalb des fuer die betreffende Geschaeftsstelle reservierten Bereichs liegen. Dies muss natuerlich unbedingt korrigiert werden! (Eine Ausnahme hiervon bilden nur die System-Benutzer ("root" usw.) und evtl. System-Gruppen.) Anhand des Nummernbereiches wird die Art des Benutzers automatisch erkannt, weswegen es hier eine Reihe nahezu identischer Fehlermeldungen gibt, die sich nur durch die Bezeichnung als "Group user", "Special user", "Normal user" bzw. einfach nur "User" unterscheiden. Dies soll dabei helfen zu erkennen, ob ein Benutzer vielleicht voellig falsch eingeordnet wurde. Kann ein Benutzer weder als Gruppen-, noch als Spezieller oder Normaler Benutzer eingeordnet werden, erscheint die (unspezifische) Fehlermeldung 16. Falls es sich bei dem Benutzer aber um einen System-Benutzer (oder evtl. eine System-Gruppe) handelt, ist diese Fehlermeldung (im Falle einer System-Gruppe die Fehlermeldung 5) natuerlich ohne Bedeutung. Die Fehlermeldungen 18 und 19 18: Error: Group '' is missing! 19: Error: User '' is missing! treten auf, wenn ein Benutzer oder eine Gruppe in "/g/sysadm/etc.passwd.new" bzw. "/g/sysadm/etc.group.new" fehlt, dem System aber bekannt (d.h. in der aktuell aktiven passwd- bzw. group-Datei eingetragen) ist. Bei einem Benutzer ist die wahrscheinlichste Ursache fuer diese Meldung der Fall, dass man ihn sowohl aus der Liste der Speziellen als auch aus der Liste der Normalen User (oder aber aus der Liste der Gruppen-User) geloescht hat. Eine andere moegliche Ursache ist, dass der betreffende Benutzer (bzw. die betreffende Gruppe) erst nach der Erstellung von "/g/sysadm/etc.passwd.new" bzw. "/g/sysadm/etc.group.new" in der aktuell aktiven passwd- bzw. group- Datei eingetragen wurde. 1.2.2 Zusammenfassung --------------------- Welche Fehlermeldungen oder Warnungen duerfen also unter Umstaenden auftreten, und welche Fehlermeldungen oder Warnungen duerfen auf keinen Fall auftreten? 1: Warning: Group id '' is not unique! Ausser bei einer System-Gruppe (falls es so etwas ueberhaupt gibt) auf keinen Fall. 2: Warning: Group name '' is not unique! 3: Error: Group name '' is not unique! 7: Warning: User name '' is not unique! 8: Error: User name '' is not unique! Auf keinen Fall. 4: Warning: Group name '' didn't exist before! 9: Warning: User name '' didn't exist before! Kann beabsichtigt sein oder auf die nachtraegliche Loeschung dieses Benutzers bzw. dieser Gruppe in der aktuell aktiven passwd- bzw. group-Datei hinweisen. 6: Warning: User id '' is not unique! Ausser bei einem System-Benutzer ("root" usw.) auf keinen Fall. 10: Error: User '' belongs to non-existent group ''! Sollte nicht auftreten. Wird aber von den nachfolgenden Schritten toleriert. 11: Error: Group user '' has UID <> GID ( <> )! Ist nach dem neuen Konzept verboten. 5: Error: Group '' has GID '' outside range (%d..%d) 12: Error: Group user '' has UID '' outside range (%d..%d) 13: Error: Group user '' has GID '' outside range (%d..%d) 14: Error: Special user '' has GID '' outside range (%d..%d) 15: Error: Normal user '' has GID '' outside range (%d..%d) 16: Error: User '' has UID '' outside range (%d..%d, %d..%d) 17: Error: User '' has GID '' outside range (%d..%d) Auf keinen Fall. 18: Error: Group '' is missing! 19: Error: User '' is missing! Auf keinen Fall. (Selbst wenn man einen Benutzer oder eine Gruppe loeschen will, sollte dies erst nach Umstellung des Filesystems erfolgen, da ja auch deren Dateien und Verzeichnisse eine neue UID und GID erhalten muessen!) 1.3 disjoin ----------- Das Tool "disjoin" ist dafuer gedacht, beim Abgleich der passwd- und group- Dateien von mehreren Rechnern unterstuetzend eingesetzt zu werden, wenn es auf diesen Rechnern viele Benutzer gibt, die auf mehreren dieser Rechner ein Account haben, um sicherzustellen, dass beim Editieren der passwd- und group- Dateien hinterher keine Benutzer doppelt vorkommen (bzw. kein Benutzer zwei verschiedene UIDs haben kann) oder verlorengehen (bzw. analog bei Gruppen). (Man kann es ausserdem auch beim Editieren der neuen passwd-Datei einsetzen, wenn man aus dem Abschnitt fuer die Speziellen User die Normalen, und aus dem Abschnitt fuer die Normalen User die Speziellen User loescht. Mehr dazu siehe im Abschnitt 1.3.3 weiter unten.) Das Tool wurde dabei so geschrieben, dass es nicht dieses spezielle Problem vollstaendig loest, sondern ein allgemeineres. Die Loesung des speziellen Problems wird dann auf die des allgemeineren zurueckgefuehrt. Praktisch bedeutet dies, dass das Tool mehrmals, in mehreren aufeinander- folgenden Schritten, eingesetzt werden muss. Der Vorteil dieses Konzepts liegt darin, dass das Tool fuer andere Zwecke und Probleme wiederverwendbar und nicht ein Wegwerf-Tool fuer den Einmal- gebrauch ist. Die allgemeinere Problemstellung ist dabei folgende: Angenommen man hat zwei Dateien mit Datensaetzen (Records). Jede Zeile in diesen beiden Dateien stellt einen Datensatz dar. Jeder Datensatz ist mit Hilfe eines Trennzeichens (oder auch eines Trennstrings, wie z.B. ", ") in Felder aufgeteilt. Eines dieser Felder oder auch mehrere Felder zusammen bilden den Schluessel des Datensatzes. Dieser Schluessel sollte jeweils innerhalb einer Datei eindeutig sein. Es ist aber nicht ausgeschlossen, dass derselbe Schluessel in beiden Dateien vorkommt (!). Konkretes Beispiel (das eingangs erwaehnte spezielle Problem): Die passwd-Dateien auf der SUN von BI und den SUN's von FI enthalten die Informationen zu jedem Benutzer, der sich auf diesen Rechnern einloggen darf. Dort ist das Login-Kuerzel des Benutzers, sein Passwort (in ver- schluesselter Form), seine User-ID- und Gruppen-ID-Nummer, sein voller Name, sein Home-Verzeichnis und seine Login-Shell eingetragen (jeweils eine Zeile pro Benutzer, wobei die verschiedenen Eintraege durch Doppel- punkte (":") voneinander getrennt sind). Das Login-Kuerzel ist dabei der eindeutige Schluessel. (Die User-ID-Nummer muss nicht eindeutig sein, da es mehrere Benutzer mit derselben User-ID-Nummer geben kann; z.B. gibt es die beiden Login-Kuerzel "Schmidl" und "Roessler" (unsere Hardware-Lieferanten bei BI), die beide dieselbe User-ID haben.) Unter den vielen Benutzern von sd&m Muenchen gibt es nun eine ganze Reihe, die sowohl auf der SUN von BI als auch auf den SUN's von FI ein Account besitzen, und demzufolge in beiden passwd-Dateien auftauchen. Innerhalb jeweils eines der beiden Bereiche ist deren Login-Kuerzel aber selbstverstaendlich eindeutig. Zurueck zur allgemeinen Problemstellung: Angenommen, man moechte nun herausbekommen, welche Schluessel in BEIDEN Dateien vorkommen, und weiter angenommen, man moechte JEDE dieser beiden Dateien JEWEILS FUER SICH in die Datensaetze aufteilen, deren Schluessel in BEIDEN Dateien vorkommen, und in die Datensaetze, deren Schluessel NUR in der jeweiligen Datei vorkommen. In unserem konkreten Fall heisst das: Zerlege beide passwd-Dateien in die Datensaetze, deren Benutzer nur auf der jeweiligen Maschine ein Account besitzen, sowie in die Datensaetze, deren Benutzer auf BEIDEN Maschinen ein Account haben. Die Datensaetze der beiden passwd-Dateien duerfen dabei natuerlich nicht vermischt werden, da ein Benutzer auf beiden Maschinen unterschiedliche Passwoerter, Home-Verzeichnisse und Login-Shells haben kann. Das Tool "disjoin" leistet genau dies alles. Um dessen Funktionsweise hier jedoch nicht nur verbal zu beschreiben, sondern auch graphisch zu veranschaulichen, folgen zwei Schaubilder: Datenflussdiagramm: Datei_A Datei_B | | \ / \ / \ / | | Vergleich ---> ====+====+==== <--- Vergleich ( Pass 1 ) | | | | | / \ | V / \ V stellt "Weiche" ---> /| |\ <--- stellt "Weiche" ( Pass 2 ) / | | \ / | | \ / | | \ / | | \ / | | \ | | | | V V V V Datei_A.1 Datei_A.0 Datei_B.0 Datei_B.1 Mengendiagramm: ______ / \ ______ / \/ \ ( / ) \ ( A ( ) ) ( ( C ) ) ( ( ) B ) \ ( / ) \______/\ / \______/ Dabei gilt: Die Menge ( A + C ) ist die Menge der Schluessel der Datei_A, die Menge ( B + C ) ist die Menge der Schluessel der Datei_B, die Menge ( C ) ist die Schnittmenge der Mengen der Schluessel der Dateien Datei_A und Datei_B. Das Programm ermittelt im ersten Durchlauf (Pass 1) die Schnittmenge der Schluessel der beiden Dateien Datei_A und Datei_B. Im einem zweiten Durchlauf (Pass 2) wird jede der beiden Dateien (jeweils fuer sich!) in zwei Dateien aufgeteilt: Diejenigen Datensaetze aus der Datei_A, die einen Schluessel aus der Schnitt- menge ( C ) der Schluessel besitzen, wandern in die Datei_A.0, waehrend die Datensaetze, deren Schluessel in der Menge ( A ) liegen, in die Datei_A.1 wandern. Mnemonic: Die Null wird auf Rechnern meist mit Schraegstrich ("/") dargestellt und gleicht dadurch dem Zeichen fuer "Durchschnitt", ein "o" mit "/". Die Eins steht fuer "eindeutige, nur ein einziges Mal vorkommende Schluessel". Genauso bei der Datei_B: Die Datensaetze mit einem Schluessel aus der Schnitt- menge ( C ) der Schluessel wandern in die Datei_B.0, waehrend die Datensaetze, deren Schluessel in der Menge ( B ) liegen, in die Datei_B.1 wandern. Die beiden urspruenglichen Dateien, Datei_A und Datei_B, werden von dem Tool nicht veraendert. 1.3.1 Hinweise zur Benutzung ---------------------------- Als Trennzeichen kann mit Hilfe der Option "-F" ein beliebiges Zeichen, ein String oder sogar ein regulaerer Ausdruck (in PERL-Syntax) festgelegt werden. Der angegebene Ausdruck wird jedoch IMMER als regulaerer Ausdruck inter- pretiert. Das bedeutet, dass man PERL-Metazeichen wie "|", "*", "+", "?", "[", "]", "(", ")", "^", "$", "." usw. mit Backslash ("\") maskieren muss, wenn man sie in ihrer woertlichen Bedeutung benutzen will. (Ausserdem ist natuerlich der ganze Ausdruck vor der Auswertung durch die Shell zu schuetzen, am besten durch Einschliessen in einfachen Anfuehrungs- zeichen (').) Als Default fuer das Trennzeichen ist der Doppelpunkt (":") voreingestellt. Mit Hilfe der Option "-L" kann eine Liste von Nummern derjenigen Felder ange- geben werden, die zusammen den (eindeutigen!) Schluessel bilden. Sollte ein Schluessel innerhalb einer der beiden Eingabe-Dateien nicht eindeutig sein, wird eine entsprechende Warnungsmeldung ausgegeben. (Dies hat jedoch keinen Einfluss auf das korrekte Funktionieren des Programms; das Programm liefert auch in diesem Falle stets die erwuenschten Ausgaben!) Die Zaehlung der Felder beginnt bei Eins, ein Feld mit der Nummer 0 existiert nicht. Wird es trotzdem verwendet, liefert es als Wert konstant die leere Zeichenkette zurueck. Als Default fuer das Schluesselfeld ist "1" eingestellt - denn EIN Feld sollte es natuerlich IMMER mindestens pro Datensatz geben! Ausserdem wird der Schluessel sehr oft im ersten Feld abgelegt, so dass dieser Defaultwert doppelt sinnvoll ist. Beispiel fuer einen Aufruf: % disjoin -F '[ \t]+' -L 1,3 meine_db.alt meine_db.neu (Das Trennzeichen ist eine beliebige Folge (mit einer Laenge groesser/gleich Eins) von Leerzeichen oder Tabulatoren. Die einfachen Anfuehrungszeichen um den regulaeren Ausdruck verhindern die Interpretation durch die Shell. Das erste und das dritte Feld bilden den Schluessel.) Die Ausgabe koennte lauten: > Field separator = '[ \t]+' > Key field number list = '1,3' > > The intersection of the two sets of keys of > file 'meine_db.alt' > and > file 'meine_db.neu' > is empty. In diesem Fall wurden keine Ausgabe-Dateien erzeugt. Die Ausgabe koennte aber auch lauten: > Field separator = '[ \t]+' > Key field number list = '1,3' > > Wrote records of file 'meine_db.alt' > with shared keys into 'meine_db.alt.0' > with unique keys into 'meine_db.alt.1' > > Wrote records of file 'meine_db.neu' > with shared keys into 'meine_db.neu.0' > with unique keys into 'meine_db.neu.1' 1.3.2 Abgleich zweier passwd-Dateien ------------------------------------ Wie kann man nun das "disjoin"-Tool beim Abgleich zweier passwd-Dateien ein- setzen? Das Ziel besteht darin, den Benutzern mit Accounts auf zwei Rechnern (zweier verschiedener Bereiche mit unterschiedlichen Nummernkreisen) eine eindeutige UID zuzuordnen. Dazu muss (zumindest pro forma) jeder Benutzer mit Doppelaccount einem der beiden Rechner bzw. Bereiche zugeordnet werden. Dazu muessen die Benutzer mit Doppelaccount im ersten Schritt erst einmal ermittelt und aus den jeweiligen passwd-Dateien herausgeloest werden. Im zweiten Schritt werden diese Benutzer (pro forma) einem der beiden Rechner bzw. Bereiche zugeordnet. In einem dritten Schritt werden die Benutzer mit Doppelaccount entsprechend der formalen Zuordnung zu einem der Bereiche auseinandersortiert; anschlies- send wird ihnen jeweils eine eindeutige UID aus dem Nummernkreis des Bereiches verliehen, dem sie angehoeren. Wie sieht das in der Praxis aus? Die Default-Werte des "disjoin"-Tools sind guenstigerweise so eingestellt, dass sie fuer die Anwendung auf passwd-Dateien (oder auch group-Dateien) ohne Aenderung passen. Man braucht sich also darum keine Gedanken mehr zu machen. Es wird vorausgesetzt, dass auf beiden Rechnern mit Hilfe des Tools "getpwgr" zuerst die neuen passwd- und group-Dateien erzeugt und diese anschliessend ueberarbeitet wurden (Loeschen der Normalen User aus dem Abschnitt fuer die Speziellen sowie der Speziellen User aus dem Abschnitt fuer die Normalen User). Dann kopiert man die ueberarbeitete neue passwd-Datei (und ggfs. auch die group-Datei, falls diese ebenfalls abgeglichen werden sollen) des einen Rechners auf den anderen. Auf diesem letzteren Rechner arbeitet man nun wie folgt weiter: Zu Anfang werden die beiden Abschnitte der Normalen Benutzer aus beiden passwd-Dateien jeweils in eine eigene Datei kopiert. (Dies geht von der Annahme aus, dass nur die Eintraege der Normalen Benutzer abgeglichen werden sollen!) Die Namen dieser beiden Dateien seien "passwd.bi" und "passwd.fi". Im ersten Schritt werden diese beiden Dateien nun in die Datensaetze der Benutzer mit einem Account nur auf EINEM der beiden Rechner sowie der Benutzer mit einem Account auf BEIDEN Rechnern zerlegt: % disjoin passwd.bi passwd.fi > Field separator = ':' > Key field number list = '1' > > Wrote records of file 'passwd.bi' > with shared keys into 'passwd.bi.0' > with unique keys into 'passwd.bi.1' > > Wrote records of file 'passwd.fi' > with shared keys into 'passwd.fi.0' > with unique keys into 'passwd.fi.1' (Wie bereits frueher erwaehnt, werden die beiden Originaldateien, "passwd.bi" und "passwd.fi", durch das Tool nicht veraendert!) Wir legen nun wahlweise eine Kopie der Datei "passwd.bi.0" oder der Datei "passwd.fi.0" an, o.B.d.A. (d.h. "ohne Beschraenkung der Allgemeinheit") jedoch von der Datei "passwd.bi.0": % cp passwd.bi.0 passwd.bi.new Aus dieser Datei "passwd.bi.new" sind nun alle Benutzer zu loeschen, die NICHT zu BI gehoeren (sollen). Als naechstes muessten wir die dazu komplementaere Loeschoperation in der Datei "passwd.fi.0" durchfuehren (d.h. dort alle Benutzer loeschen, die nicht zu FI gehoeren). Diese fehleranfaellige Arbeit kann uns jedoch das "disjoin"-Tool abnehmen (!): % disjoin passwd.bi.new passwd.fi.0 > Field separator = ':' > Key field number list = '1' > > Wrote records of file 'passwd.bi.new' > with shared keys into 'passwd.bi.new.0' > with unique keys into 'passwd.bi.new.1' > > Wrote records of file 'passwd.fi.0' > with shared keys into 'passwd.fi.0.0' > with unique keys into 'passwd.fi.0.1' Da die Datei "passwd.fi.0" die Obermenge der Menge der Schluessel der Datei "passwd.bi.new" enthaelt (da definitionsgemaess JEDER Schluessel aus EINER der beiden Dateien "passwd.bi.0" und "passwd.fi.0" in BEIDEN Dateien vor- kommt!), ist "passwd.bi.new.0" mit "passwd.bi.new" identisch und die Datei "passwd.bi.new.1" ist leer. Ausserdem enthaelt die Datei "passwd.fi.0.0" nun die Datensaetze der selben Benutzer wie in der Datei "passwd.bi.new" (d.h. sie enthaelt dieselben Schluessel, die Datensaetze selbst koennen sich natuerlich unterscheiden!) und die Datei "passwd.fi.0.1" enthaelt das eigentlich gesuchte Komplement. Wir taufen diese letztere Datei nun um, damit die Namen der beiden Ergebnis- dateien auch ihren gemeinsamen Stand reflektieren: % mv passwd.fi.0.1 passwd.fi.new Die beiden Ergebnisdateien "passwd.bi.new" und "passwd.fi.new" enthalten nun nur noch die Datensaetze der Benutzer aus dem jeweiligen Bereich. Alle uebrigen Hilfsdateien (Zwischenergebnisse) koennen (sollten) nun wieder geloescht werden: % rm passwd.bi.new.* % rm passwd.fi.0.0 Jetzt koennen wir endlich die Dateien der Benutzer mit Doppelaccount von jedem der beiden Bereiche ("passwd.bi.0" und "passwd.fi.0") in die "bereichseigenen" und die "bereichsfremden" Benutzer aufteilen: % disjoin passwd.bi.0 passwd.bi.new > Field separator = ':' > Key field number list = '1' > > Wrote records of file 'passwd.bi.0' > with shared keys into 'passwd.bi.0.0' > with unique keys into 'passwd.bi.0.1' > > Wrote records of file 'passwd.bi.new' > with shared keys into 'passwd.bi.new.0' > with unique keys into 'passwd.bi.new.1' % disjoin passwd.fi.0 passwd.fi.new > Field separator = ':' > Key field number list = '1' > > Wrote records of file 'passwd.fi.0' > with shared keys into 'passwd.fi.0.0' > with unique keys into 'passwd.fi.0.1' > > Wrote records of file 'passwd.fi.new' > with shared keys into 'passwd.fi.new.0' > with unique keys into 'passwd.fi.new.1' Die Dateien "passwd.bi.1" und "passwd.fi.1" enthalten nun die Datensatze der Benutzer aus dem betreffenden Bereich, die Dateien "passwd.bi.0.0" und "passwd.fi.0.0" enthalten die Datensatze der Benutzer mit Doppelaccount aus dem betreffenden Bereich, und die Dateien "passwd.bi.0.1" und "passwd.fi.0.1" enthalten die Datensaetze der Benutzer mit Doppelaccount aus dem jeweils anderen Bereich. Die Hilfsdateien "passwd.bi.new*" und "passwd.fi.new*" werden ab hier nicht mehr benoetigt und koennen geloescht werden: % rm passwd.bi.new* % rm passwd.fi.new* Die "bereichsfremden" Benutzer muessen nun noch ihre UID aus dem anderen Bereich eingetragen bekommen, zu dem sie ja (zumindest pro forma) gehoeren. Dies wird von einem weiteren Tool bewerkstelligt, das die UIDs (bei group- Dateien die GIDs) der Benutzer aus einer passwd-Datei (bzw. group-Datei) einliest und diese bei denselben Benutzern in der anderen passwd-Datei (bzw. group-Datei) eintraegt (die Reihenfolge der Eintraege spielt dabei keine Rolle!). Dieses Tool heisst "idcopy". Die erste angegebene Datei ist die Quelle, die zweite angegebene Datei das Ziel der Kopieraktion. Die Ausgabe wird jedoch nicht in die zweite angegebene Datei geschrieben, sondern in eine neu erstellte Ausgabedatei. Diese Ausgabedatei erhaelt dabei den Namen der zweiten angegebenen Datei, an den ein Punkt und der Name des Tools ("idcopy") angehaengt wurde. Falls ein Benutzer in der ersten angegebenen Datei mehrfach vorkommt, erfolgt eine entsprechende Warnung, falls die UIDs uebereinstimmen, und ein Programm- abbruch mit Fehlermeldung sonst. Existiert fuer einen Benutzer aus der zweiten angegebenen Datei kein Eintrag in der ersten angegebenen Datei, wird die UID dieses Benutzers nicht veraendert und es erfolgt eine entsprechende Warnungsmeldung. Wie oben bereits erwaehnt, enthalten die Dateien "passwd.bi.0.0" und "passwd.fi.0.0" die Datensatze der Benutzer mit Doppelaccount aus dem BETREFFENDEN Bereich, und die Dateien "passwd.bi.0.1" und "passwd.fi.0.1" enthalten die Datensaetze der Benutzer mit Doppelaccount aus dem jeweils ANDEREN Bereich. Daher muessen die UIDs der Benutzer mit Doppelaccount nun wie folgt ueber Kreuz kopiert (eingetragen) werden: % idcopy passwd.bi.0.0 passwd.fi.0.1 > 'idcopy' version 1.0.1 > > Input file (source) = 'passwd.bi.0.0' > Input file (target) = 'passwd.fi.0.1' > Output file = 'passwd.fi.0.1.idcopy' % idcopy passwd.fi.0.0 passwd.bi.0.1 > 'idcopy' version 1.0.1 > > Input file (source) = 'passwd.fi.0.0' > Input file (target) = 'passwd.bi.0.1' > Output file = 'passwd.bi.0.1.idcopy' Anschliessend fuegt man alle Ergebnisdateien zusammen: % cat passwd.bi.1 passwd.bi.0.0 passwd.bi.0.1.idcopy >passwd.bi.result % cat passwd.fi.1 passwd.fi.0.0 passwd.fi.0.1.idcopy >passwd.fi.result Ganz zum Schluss loescht man in den beiden neuen (ueberarbeiteten) passwd- Dateien ("/g/sysadm/etc.passwd.new" auf der jeweiligen Maschine) den Ab- schnitt der Normalen User und fuegt an dessen Stelle die Datei "passwd.bi.result" bzw. "passwd.fi.result" ein. Anschliessend koennen alle Hilfsdateien geloescht werden: % rm passwd.bi* % rm passwd.fi* Damit ist der Abgleich erfolgreich durchgefuehrt. Der Abgleich von group-Dateien erfolgt vollkommen analog. Hinweis: -------- Die hier angegebenen Kommandos muessen nicht unbedingt von Hand eingegeben werden. Wenn man der hier vorgeschlagenen Namenskonvention folgt und die beiden abzu- gleichenden Dateien "passwd.bi" und "passwd.fi" nennt (das koennen auch group- Dateien sein!), kann man das Shell-Skript "pwadjust" aufrufen, das genau die in diesem Abschnitt angegebene Folge von Kommandos enthaelt. (Es werden nur einige Hilfsdateien zu Kontrollzwecken nicht geloescht.) Achtung: Es erfolgen keine Checks, ob ein vom Skript aufgerufenes Kommando erfolgreich war! Da beim Ablauf des Skripts keine Daten zerstoert, sondern nur erzeugt werden, ist das tolerierbar. Man darf auch auf keinen Fall STDOUT oder STDERR in eine Datei umlenken, da man sonst nicht editieren kann. 1.3.3 Anwendung bei der Ueberarbeitung der neuen passwd-Datei ------------------------------------------------------------- Wie wir im vorangehenden Abschnitt gesehen haben, kann man mit Hilfe des "disjoin"-Tools sehr leicht die Komplementmenge einer Menge erzeugen oder die zu einer Loeschoperation in einer ersten Menge komplementaere Loesch- operation in einer zweiten Menge induzieren. Dies kann bei der manuellen Ueberarbeitung der neuen passwd-Datei (siehe Abschnitt 1.1.2) sehr nutzbringend angewendet werden, wo aus dem Abschnitt fuer die Speziellen User die Normalen, und aus dem Abschnitt fuer die Normalen User die Speziellen User geloescht werden muessen. Dazu kopiert man aus der Datei "etc.passwd.new" die beiden Abschnitte fuer die Speziellen und die Normalen User jeweils in eine Datei (jedoch ohne die Ueber- schriften!). Die Namen dieser beiden Dateien seien fuer das folgende "passwd.spez" sowie "passwd.norm". (Anmerkung: Diese Dateien kann man auch automatisch von dem "getpwgr"-Tool erzeugen lassen, wenn man die Split-Option "-s" verwendet. Die so erzeugten Dateien heissen dann allerdings "/g/sysadm/etc.passwd.new.g", "/g/sysadm/etc. passwd.new.s" und "/g/sysadm/etc.passwd.new.n", fuer die Gruppen-, Speziellen und Normalen User, respektive.) Man loescht nun (von Hand) aus einer der beiden Dateien (o.B.d.A. sei dies "passwd.spez") alle diejenigen Benutzer, die NICHT in diese Kategorie gehoeren. Anschliessend benutzt man das "disjoin"-Tool, um die dazu komplementaere Loeschung in der anderen Datei durchzufuehren: % disjoin passwd.spez passwd.norm > Field separator = ':' > Key field number list = '1' > > Wrote records of file 'passwd.spez' > with shared keys into 'passwd.spez.0' > with unique keys into 'passwd.spez.1' > > Wrote records of file 'passwd.norm' > with shared keys into 'passwd.norm.0' > with unique keys into 'passwd.norm.1' Da in den beiden urspruenglichen Dateien "passwd.spez" und "passwd.norm" die selben Benutzer vorkommen, enthaelt die Datei "passwd.norm" nach den Loeschungen in "passwd.spez" die Obermenge der Menge der Schluessel der beiden Dateien. Daher ist die Datei "passwd.spez.0" mit der editierten Datei "passwd.spez" identisch und die Datei "passwd.spez.1" ist leer. Die Datei "passwd.norm.0" enthaelt nun die Eintraege derselben Benutzer wie in den Dateien "passwd.spez.0" und "passwd.spez" (die Datensaetze unterscheiden sich allerdings in der UID!) und die Datei "passwd.norm.1" enthaelt das eigentlich gesuchte Komplement, d.h. nur die Normalen User. Zum Schluss ersetzt man den Abschnitt der Speziellen User in der Datei "etc.passwd.new" durch den Inhalt der Datei "passwd.spez" sowie den Abschnitt der Normalen User durch den Inhalt der Datei "passwd.norm.1", und loescht danach alle Hilfsdateien: % rm passwd.spez* % rm passwd.norm* Auch in anderer Hinsicht kann sich das "disjoin"-Tool bei der manuellen Ueber- arbeitung der neuen passwd- und group-Datei nuetzlich machen. Statt die UIDs und GIDs der faelschlicherweise als Gruppen-User eingeordneten System-User (wie bin, uucp usw.) von Hand wieder auf den urspruenglichen Wert zu setzen, kann man auch folgendes tun: Zuerst erstellt man mit Hilfe des Tools "copypwgr" eine Kopie der aktuellen passwd- und group-Datei des Systems (dieses Tool hat den Vorteil, vom Vor- handensein des NIS-Systems (Yellow Pages) unabhaengig zu sein): % copypwgr (Ohne Parameter!) Defaultmaessig legt dieses Tool seine Ausgaben in den beiden Dateien "/g/sysadm/etc.passwd.old" und "/g/sysadm/etc.group.old" ab: > 'copypwgr' Version 1.0 > > Name of copied passwd file = '/g/sysadm/etc.passwd.old' > Name of copied group file = '/g/sysadm/etc.group.old' (Mit Hilfe der "-p"- und "-g"-Option koennen jedoch auch andere Dateinamen festgelegt werden.) Anschliessend erzeugt man unter Verwendung der Split-Option ("-s") mit dem Tool "getpwgr" die neue passwd- und group-Datei. Dabei werden die Gruppen-, Speziellen und Normalen User jeweils getrennt in einer eigenen Datei abge- legt. Defaultmaessig lauten die Dateinamen "/g/sysadm/etc.passwd.new.g", "/g/sysadm/etc.passwd.new.s" und "/g/sysadm/etc.passwd.new.n". Mit Hilfe des "disjoin"-Tools kann man nun auch die Datei "/g/sysadm/etc. passwd.old" in die gleichen drei Kategorien zerlegen: % cd /g/sysadm % disjoin etc.passwd.old etc.passwd.new.g % mv etc.passwd.old.0 etc.passwd.old.g % disjoin etc.passwd.old etc.passwd.new.s % mv etc.passwd.old.0 etc.passwd.old.s % disjoin etc.passwd.old etc.passwd.new.n % mv etc.passwd.old.0 etc.passwd.old.n % rm etc.passwd.old.1 % rm etc.passwd.new.?.? Nun editiert man die drei Dateien "/g/sysadm/etc.passwd.new.g", "/g/sysadm/etc.passwd.new.s" und "/g/sysadm/etc.passwd.new.n" wie in Abschnitt 1.1.2 ("Handarbeiten") bzw. weiter oben beschrieben. Bei den Gruppen-Usern loescht man jedoch einfach nur alle System-User heraus, statt von Hand die alten UIDs und GIDs wieder einzusetzen. Anschliessend extrahiert man mit Hilfe des "disjoin"-Tools die fehlenden System-User aus der Datei "/g/sysadm/etc.passwd.old.g" wieder heraus: % disjoin etc.passwd.old.g etc.passwd.new.g Die Datei "/g/sysadm/passwd.old.g.1" enthaelt dann die fehlenden System-User. Beispielsweise mit % cat etc.passwd.old.g.1 >>etc.passwd.new.g kann man diese dann wieder in die Datei "/g/sysadm/etc.passwd.new.g" einfuegen. Zuletzt loescht man alle Hilfsdateien (beispielsweise) mit: % rm etc.passwd.*.g.* (In dieser Loesch-Anweisung ist der letzte Punkt von vitaler Bedeutung: Fehlt er, wird auch die soeben erzeugte Ergebnisdatei geloescht!) 2. Erstellen der Parameterdateien --------------------------------- Das Werkzeug zur Umstellung des Filesystems auf die neuen User-ID- und Gruppen-ID-Nummern (die ja im Kopf jeder einzelnen Datei vermerkt sind) benoetigt zwei Parameter-Dateien, durch die ihm mitgeteilt wird, welche neue UID bzw. GID ein bestimmter Benutzer bzw. eine bestimmte Gruppe erhaelt. Die eine Parameter-Datei enthaelt dabei die Abbildungsvorschrift fuer die Benutzer, die andere die Abbildungsvorschrift fuer die Gruppen. (Man kann das im naechsten Kapitel beschriebene Tool also nicht nur fuer die hier beschriebene General-Umstellung benutzen, sondern zum Beispiel auch dazu, die Dateien eines ausscheidenden Mitarbeiters einem anderen User zuzuordnen, bevor der User des ausscheidenden Mitarbeiters aus der passwd-Datei entfernt wird!) Die Syntax dieser beiden Dateien ist sehr einfach: bzw. Pro Zeile wird also jeweils ein User- bzw. Gruppen-Name angegeben, gefolgt von der UID bzw. GID, die dieser Benutzer bzw. diese Gruppe erhalten soll. Zur Erhoehung der Lesbarkeit koennen beliebig Leerzeichen und Tabulatoren eingesetzt werden. (Leerzeilen und Kommentare sind jedoch nicht vorgesehen.) Fuer die hier beschriebene General-Umstellung kann man das Tool "makeidfile" verwenden, um diese beiden Parameter-Dateien aus der zuvor erstellten neuen passwd- und group-Datei (defaultmaessig "/g/sysadm/etc.passwd.new" und "/g/sysadm/etc.group.new") automatisch zu erzeugen: makeidfile /g/sysadm/uid.uid makeidfile /g/sysadm/gid.gid Dieses Tool ist ein simpler Filter, der einfach jeweils das erste und dritte Feld einer Eingabezeile in die Ausgabe schreibt, wobei der Doppelpunkt (":") als Feldtrennzeichen dient. (Praktischerweise sind sowohl im Format der passwd- als auch der group- Datei die hier relevanten Informationen (User-login-Kuerzel und UID bzw. Group-Name und GID) im ersten und dritten Feld abgelegt, so dass man nicht zwei verschiedene Filter braucht.) 3. Umstellung des Filesystems (migid) ------------------------------------- Das Werkzeug zur Umstellung der Besitzer- und Gruppenzuordnungen der Dateien des Filesystems heisst "migid", was ein Akronym fuer "[mig]rate [id]'s" ist. Mittels zweier Parameterdateien kann festgelegt werden, welche Benutzer und welche Gruppen auf welche neuen User- und Gruppen-ID-Nummern umgestellt werden. (Dadurch koennen z.B. auch einzelne Benutzer oder Gruppen umgestellt werden!) Defaultmaessig werden als Parameterdateien "/g/sysadm/uid.uid" (fuer die Abbildung von Benutzern auf neue UIDs) und "/g/sysadm/gid.gid" (fuer die Abbildung von Gruppen auf neue GIDs) verwendet. Mit Hilfe der Optionen "-u" und "-g" koennen jedoch auch andere Namen und Pfade gewaehlt werden (genaueres hierzu siehe in der Hilfe-Seite, die durch den Aufruf von "migid" ohne Parameter oder mit Paramter "-h" oder "-?" ausge- geben wird!). Das Tool traversiert rekursiv alle Verzeichnisse ab einem bestimmten Start- verzeichnis und fuehrt gegebenenfalls ein "chown" auf den darin enthaltenen Unterverzeichnissen, Dateien und Softlinks (und nur diesen) durch. Der Default fuer das Startverzeichnis ist das aktuelle Verzeichnis ("."), mit Hilfe der Option "-d" kann jedoch auch ein anderes Verzeichnis als Start- verzeichnis festgelegt werden. ============== ACHTUNG: ============== Beim rekursiven Abstieg in alle Unterverzeichnisse werden Softlinks _NICHT_ beachtet (d.h. nicht verfolgt)! (Das verhindert, dass sich das Programm moeglicherweise in einer Endlos- schleife aufhaengt!) Will man das gesamte Filesystem umstellen (was in jedem Fall anzuraten ist, da ein Benutzer ja auch Dateien ausserhalb seines Home-Verzeichnisses und dessen Unterverzeichnissen haben kann!), so ist gegebenenfalls das Tool auf jede an den Rechner angeschlossene Harddisk separat anzusetzen, falls diese mit Softlinks in das Filesystem der Boot-Platte eingehaengt sind! Ausser den oben bereits genannten Optionen ("-d", "-u" und "-g") gibt es noch die Optionen "-m", "-t" und "-v": Die Option "-m" erlaubt es, mehrere Benutzer bzw. Gruppen auf dieselbe ID-Nummer abzubilden, was ohne diese Option nicht zugelassen wird und zum Programmabbruch fuehrt, noch bevor irgend etwas am Filesystem veraendert wird. Diese Option ist z.B. dann sinnvoll, wenn die Dateien mehrerer ausgeschiede- ner Mitarbeiter alle einem bestimmten anderen User zugeordnet werden sollen, bevor ihre Accounts geloescht werden. Im Normalfall sollte die Zuordnung der Benutzer und Gruppen zu ihren neuen ID-Nummern aber eindeutig (bijektiv) sein. Ruft man das Tool mit der Option "-t" (fuer "Test") auf, so werden alle "chown"-Kommandos nur simuliert, d.h. sie werden protokolliert, aber nicht wirklich ausgefuehrt. Die Option "-v" (fuer "verbose", geschwaetzig) schliesslich schaltet eine ausfuehrliche Protokollierung ein, bei der saemtliche Parameter (saemtliche Optionen und alle Tabellen der User, Gruppen, UIDs und GIDs, sowohl aus den Parameterdateien als auch den gerade aktiven passwd- und group-Dateien, die vom Programm verwendet werden) und alle durchgefuehrten "chown"-Kommandos aufgelistet werden. Es ist empfehlenswert, diese Option immer zu verwenden und die entsprechenden Ausgaben des Programmes (fuer spaetere Kontrollzwecke) in einer Datei aufzu- fangen. Die Protokoll-Ausgaben erfolgen dabei auf STDOUT, zusaetzlich koennen jedoch auch Fehlermeldungen oder Warnungen auftreten, die dann auf STDERR ausgegeben werden. Es empfiehlt sich, auch die Ausgaben auf STDERR fuer spaetere Kontrollzwecke in eine Datei umzuleiten. Ein Aufruf des Tools koennte also beispielsweise wie folgt aussehen: migid -v -d / >migid.out.log 2>migid.err.log Bei gesetzter "-v"- oder "-t"-Option wird zum Schluss noch die verstrichene Zeit ausgegeben, die das Tool zur Bearbeitung gebraucht hat: Elapsed time: %d year%s %d day%s %d hour%s %d minute%s %d second%s. -------------- Hinweis: -------------- Das Tool benutzt die aktive passwd- und group-Datei des Systems, um zu einem Verzeichnis, einer Datei oder einem Softlink den Namen des Besitzers und der Gruppe zu ermitteln, um anschliessend mit Hilfe der Parameterdateien (und den darin enthaltenen Namen) die neue ID-Nummer ermitteln zu koennen. Aus diesem Grund darf bei der General-Umstellung (aber auch sonst!) die neue passwd- und group-Datei erst aktiviert ("scharf" gemacht) werden, _NACHDEM_ das "migid"-Tool seine Arbeit getan hat! ============== ACHTUNG: ============== Da nur der System-Superuser ("root") alle Verzeichnisse lesen sowie auf nicht ihm gehoerenden Verzeichnissen, Dateien und Softlinks ein "chown"- Kommando ausfuehren darf, ist es unbedingt erforderlich, sich vor Verwendung des "migid"-Tools als "root" einzuloggen! Insbesondere reicht es _NICHT_ aus, lediglich den Owner des "migid"-Tools mit "chown" auf "root" zu setzen und anschliessend (z.B.) mit "chmod u+s" das s-Bit zu setzen, um das Tool mit "root"-Rechten ausfuehren zu lassen! ============== ACHTUNG: ============== Damit bei der Umstellung keine Dateien "vergessen" werden, sollte das Tool unbedingt nachts laufen, wenn kein Benutzer mehr eingeloggt ist, da es sonst passieren koennte, dass dieser Benutzer neue Dateien mit seiner alten UID und GID erstellt, nachdem das "migid"-Tool bereits durch seine Verzeichnisse durchgelaufen ist, was dazu fuehren wuerde, dass diese Dateien nicht mit umgestellt wuerden und demzufolge spaeter fuer diesen Benutzer nur noch beschraenkt oder gar nicht mehr zugaenglich waeren, da er nicht mehr deren Eigentuemer waere, sobald die neue passwd-Datei aktiviert wird! Man beachte, dass einige Benutzer auch "cron"-Jobs in Auftrag gegeben haben koennten, die waehrend der Nacht neue Dateien erstellen koennten! Aus allen diesen Gruenden ist zu erwaegen, ob man zur Umstellung die Maschine nicht herunterfaehrt und die eigentliche Umstellung im Single-User-Modus durch- fuehrt. 3.1 Fehlermeldungen ------------------- Folgende fatale (d.h. zum sofortigen Programmabbruch fuehrende) Fehler- meldungen koennen beim Aufruf des Tools auftreten (Numerierung nur hier eingefuegt fuer Rueckbezuege in diesem Text): 1: Error: Unknown option '