Provided by: manpages-de_2.5-1_all bug

BEZEICHNUNG

       utmp, wtmp - Login-Datensätze

ÜBERSICHT

       #include <utmp.h>

BESCHREIBUNG

       Die  Datei  utmp  gibt  Auskunft  darüber, wer das System im Moment benutzt. Da nicht alle
       Programme utmp benutzen, kann es jedoch noch mehr Systembenutzer geben.

       Warnung:  utmp  darf  nicht  allgemein  schreibbar  sein,   weil   viele   Systemprogramme
       (törichterweise)  von  der  Korrektheit  dieser  Datei  abhängig  sind. Falls Sie utmp für
       irgendwelche anderen Benutzer als Besitzer und Gruppe  schreibbar  lassen,  riskieren  Sie
       falsche Einträge in Systemprotokolldateien und Änderungen von Systemdateien.

       Die  Datei  besteht  aus einer Sequenz von utmp-Strukturen. Die Struktur wird wie folgt in
       <utmp.h> deklariert. (Beachten Sie, dass dies nur  eine  von  mehreren  Definitionen  ist,
       Details hängen von der Version der Libc ab.)
           /* nachfolgend die Werte für das Feld ut_type */

           #define EMPTY         0 /* Datensatz enthält keine gültigen Daten
                                      (früher unter Linux als UT_UNKNOWN
                                      bekannt) */
           #define RUN_LVL       1 /* Wechsel des System-Runlevels (siehe
                                      init(8)) */
           #define BOOT_TIME     2 /* Zeitpunkt des Systemstarts (in ut_tv) */
           #define NEW_TIME      3 /* Zeit nach Änderung der Systemuhr
                                      (in ut_tv) */
           #define OLD_TIME      4 /* Zeit vor Änderung der Systemuhr
                                      (in ut_tv) */
           #define INIT_PROCESS  5 /* Prozess von init(8) erzeugt */
           #define LOGIN_PROCESS 6 /* Prozessgruppen-Führer für
                                      Benutzer-Anmeldung */
           #define USER_PROCESS  7 /* normaler Prozess */
           #define DEAD_PROCESS  8 /* beendeter Prozess */
           #define ACCOUNTING    9 /* nicht implementiert */

           #define UT_LINESIZE 32
           #define UT_NAMESIZE 32
           #define UT_HOSTSIZE 256

           struct exit_status {            /* Typ für ut_exit, nachfolgend */
               short int e_termination;    /* Abschluss-Status des Prozesses */
               short int e_exit;           /* Exit-Status des Prozesses */
           };

           struct utmp {
              short   ut_type;              /* Typ des Datensatzes */
              pid_t   ut_pid;               /* Prozess-ID des Anmeldeprozesses */
              char    ut_line[UT_LINESIZE]; /* Gerätename des Terminals -
                                               "/dev/" */
              char    ut_id[4];             /* Suffix des Terminalnamens,
                                               oder inittab(5)-ID */
              char    ut_user[UT_NAMESIZE]; /* Benutzername */
              char    ut_host[UT_HOSTSIZE]; /* Rechnername für Anmeldung auf
                                               fernem System oder Kernel-Version
                                               für Runlevel-Nachrichten */
              struct  exit_status ut_exit;  /* Exit-Status eines als
                                               DEAD_PROCESS gekennzeichneten
                                               Prozesses; wird nicht von
                                               Linux-Version von init(1)
                                               verwendet */

              /* Die Felder ut_session und ut_tv müssen bei der Kompilierung
                 für 32 Bit und 64 Bit dieselbe Größe haben. Dadurch können
                 Datendateien und gemeinsam genutzter Speicher von 32-Bit-
                 und 64-Bit-Anwendungen gemeinsam verwendet werden. */

           #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
              int32_t ut_session;           /* Session ID (getsid(2)), für
                                               Fensterverwaltung verwendet*/
               struct {
                   int32_t tv_sec;           /* Sekunden */
                   int32_t tv_usec;          /* Mikrosekunden */
               } ut_tv;                      /* Zeit-Datensatz wurde
                                                eingetragen */
           #else
                long   ut_session;           /* Session ID */
                struct timeval ut_tv;        /* Zeit-Datensatz wurde
                                                eingetragen */
           #endif

              int32_t ut_addr_v6[4];     /* Internet-Adresse des fernen
                                            Rechners, IPv4-Adressen nutzen
                                            nur ut_addr_v6[0] */
              char __unused[20];         /* für zukünftige Nutzung reserviert */
           };

           /* Vorkehrungen für Rückwärtskompatibilität */
           #define ut_name ut_user
           #ifndef _NO_UT_TIME
           #define ut_time ut_tv.tv_sec
           #endif
           #define ut_xtime ut_tv.tv_sec
           #define ut_addr ut_addr_v6[0]

       Diese  Struktur  enthält  den Namen der Gerätedatei für das Terminal des Benutzers, seinen
       Namen bei der Anmeldung und deren Zeitpunkt im Format von  time(2).  Zeichenketten  werden
       mit einem Null-Byte ('\0') beendet, wenn sie kürzer als das Feld sind.

       Die  ersten  Einträge  erstellt  init(1)  bei  der  Verarbeitung von inittab(5). Bevor ein
       solcher Eintrag verarbeitet wird, räumt init(1) utmp auf, indem bei jedem Eintrag,  dessen
       ut_type  nicht  DEAD_PROCESS  oder RUN_LVL ist und für den kein Prozess mit der PID ut_pid
       existiert, ut_type auf DEAD_PROCESS gesetzt wird und  ut_user,  ut_host  und  ut_time  mit
       Null-Bytes  gefüllt  werden. Falls kein leerer Datensatz mit der benötigten ut_id gefunden
       wird, erstellt init(1) einen neuen. Dabei wird ut_id von der  Inittab  übernommen,  ut_pid
       und ut_time werden auf die aktuellen Werte und ut_type auf INIT_PROCESS gesetzt.

       mingetty(8)  (oder  agetty(8))  findet  den  Eintrag  mittels  der  PID, ändert ut_type zu
       LOGIN_PROCESS, ändert ut_time, setzt ut_line  und  wartet  darauf,  dass  eine  Verbindung
       hergestellt  wird.  Nachdem  login(1)  einen  Benutzer  authentifizieren konnte, ändert es
       ut_type zu USER_PROCESS, ändert ut_time und setzt  ut_host  sowie  ut_addr.  Abhängig  von
       mingetty(8)  (oder agetty(8)) und login(1) könnten Datensätze auch mittels ut_line anstatt
       der vorzuziehenden ut_pid gefunden werden.

       Wenn init(1) feststellt, dass ein Prozess beendet wurde, bestimmt  es  den  entsprechenden
       Eintrag  in utmp mittels ut_pid, setzt ut_type auf DEAD_PROCESS und füllt ut_user, ut_host
       sowie ut_time mit Null-Bytes.

       xterm(1) und andere Terminal-Emulatoren erstellen direkt einen USER_PROCESS-Datensatz  und
       erzeugen  die  ut_id durch den Suffix des Terminalnamens (die Zeichen, die auf /dev/[pt]ty
       folgen). Falls sie einen DEAD_PROCESS-Datensatz  für  diese  ID  finden,  wird  er  wieder
       benutzt,  ansonsten  wird  ein  neuer  Eintrag  erstellt. Falls möglich, markieren sie vor
       Beendigung den Eintrag als DEAD_PROCESS und es wird geraten, dass  sie  ut_line,  ut_time,
       ut_user und ut_host ebenfalls mit Nullen füllen.

       telnetd(8)  erzeugt  einen  LOGIN_PROCESS-Datensatz und lässt login(1) den Rest erledigen.
       Nachdem die Telnet-Sitzung beendet ist, räumt telnetd(8) utmp in  der  oben  beschriebenen
       Art und Weise auf.

       Die  Datei  wtmp zeichnet alle An- und Abmeldungen im System auf. Das Format gleicht utmp,
       mit der Ausnahme, dass ein leerer Benutzername eine  Abmeldung  vom  zugehörigen  Terminal
       anzeigt.  Weiterhin bedeutet der Terminalname ~ mit den Benutzernamen shutdown oder reboot
       ein Herunterfahren bzw. den Neustart des Systems.  Außerdem  protokolliert  das  Paar  von
       Terminalnamen  |/}  die alte/neue Systemzeit, wenn diese durch date(1) geändert wird. wtmp
       wird durch login(1), init(1) und getty(1) (z.B.  mingetty(8)  oder  agetty(8))  verwaltet.
       Keines  dieser  Programme  erstellt  die  Datei.  Somit  wird  durch Löschen der Datei das
       Aufbewahren der Datensätze deaktiviert.

DATEIEN

       /var/run/utmp
       /var/log/wtmp

KONFORM ZU

       POSIX.1 definiert keine utmp-Struktur, sondern eine namens utmpx mit  den  Spezifikationen
       der  Felder  ut_type,  ut_pid,  ut_line,  ut_id,  ut_user  und ut_tv. Die Länge der Felder
       ut_line and ut_user wird von POSIX.1 nicht spezifiziert.

       Linux definiert die Strukturen utmpx und utmp als identisch.

   Vergleich mit historischen Systemen
       Die Einträge in Linux-utmp-Dateien sind weder zu v7/BSD noch zu System V konform,  sondern
       eine Mischung aus beiden.

       v7/BSD   hat  weniger  Felder,  vor  allem  fehlt  ut_type,  was  native  v7/BSD-Programme
       veranlasst,  tote  Einträge  und  Anmeldeeinträge  anzuzeigen.  Weiterhin  gibt  es  keine
       Konfigurationsdatei,  die  jeder Sitzung eine Eintragsnummer zuordnet. Das ist bei BSD der
       Fall, weil dort das Feld ut_id fehlt.

       In Linux (wie auch in System V) wird das ut_id-Feld nicht mehr geändert, nachdem  ihm  ein
       Wert   zugewiesen   wurde.   Dadurch   wird   dieser   Slot  reserviert,  ohne  dass  eine
       Konfigurationsdatei erforderlich ist. Das Löschen von ut_id führt zu  Race-Conditions  und
       resultiert  in  beschädigten  Einträgen  in  utmp  und potenziellen Sicherheitslücken. Die
       Semantik von System V erfordert nicht, die  oben  angegebenen  Felder  mit  Null-Bytes  zu
       löschen,  aber ermöglicht die Nutzung vieler Programme, die die BSD-Semantik verwenden und
       utmp nicht  verändern.  Wie  oben  beschrieben,  wendet  Linux  die  BSD-Konventionen  für
       Leitungsnamen an.

       In System V gibt es die Felder ut_host und ut_addr_v6 nicht.

ANMERKUNGEN

       Im  Gegensatz  zu anderen Systemen, in denen die Protokollierung in utmp durch Löschen der
       Datei abgeschaltet werden kann, muss utmp bei Linux immer vorhanden sein. Wenn Sie  who(1)
       deaktivieren wollen, darf utmp nicht für alle anderen Systembenutzer (world) lesbar sein.

       Das  Dateiformat  ist  maschinenabhängig.  Es  wird  daher  empfohlen, dass es nur auf der
       Architektur verarbeitet wird, auf der es erstellt wurde.

       Beachten Sie, dass  auf  biarch-Architekturen,  also  Systemen,  die  sowohl  32-Bit-  und
       64-Bit-Anwendungen ausführen können (x86-64, ppc64, s390x usw.), ut_tv im 32-Bit-Modus und
       auch im 64-Bit-Modus die gleiche Größe hat. Das gleiche gilt für ut_session  und  ut_time,
       wenn  Sie  vorhanden  sind.  Dies  ermöglicht  den  gemeinsamen  Zugriff  von  32-Bit- und
       64-Bit-Anwendungen auf Datendateien und gemeinsamen Speicher. Das wird erreicht, indem der
       Typ  von  ut_session zu int32_t geändert wird und der von ut_tv zu einer »struct« mit zwei
       int32_t-Feldern ( tv_sec und tv_usec). Da ut_tv womöglich nicht das Gleiche  ist  wie  ein
       struct timeval, wird anstelle des Aufrufs

           gettimeofday((struct timeval *) &ut.ut_tv, NULL);

       die folgende Methode empfohlen, das Feld zu setzen:

           struct utmp ut;
           struct timeval tv;

           gettimeofday(&tv, NULL);
           ut.ut_tv.tv_sec = tv.tv_sec;
           ut.ut_tv.tv_usec = tv.tv_usec;

SIEHE AUCH

       ac(1),   date(1),   init(1),   last(1),   login(1),   logname(1),  lslogins(1),  users(1),
       utmpdump(1), who(1), getutent(3), getutmp(3), login(3), logout(3), logwtmp(3), updwtmp(3)

KOLOPHON

       Diese Seite  ist  Teil  der  Veröffentlichung  4.15  des  Projekts  Linux-man-pages.  Eine
       Beschreibung  des  Projekts,  Informationen,  wie  Fehler gemeldet werden können sowie die
       aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die deutsche Übersetzung dieser Handbuchseite wurde von Daniel  Kobras  <kobras@linux.de>,
       Helge     Kreutzmann     <debian@helgefjell.de>     und     Martin     Eberhard    Schauer
       <Martin.E.Schauer@gmx.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation;  lesen  Sie  die  GNU  General  Public  License
       Version   3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE  HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.