UTMP(5)

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;              /* Type of record */
    pid_t   ut_pid;               /* PID of login process */
    char    ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */
    char    ut_id[4];             /* Terminal name suffix,
                                     or inittab(5) ID */
    char    ut_user[UT_NAMESIZE]; /* Username */
    char    ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
                                     kernel version for run-level
                                     messages */
    struct  exit_status ut_exit;  /* Exit status of a process
                                     marked as DEAD_PROCESS; not
                                     used by Linux init (1 */
    /* The ut_session and ut_tv fields must be the same size when
       compiled 32- and 64-bit.  This allows data files and shared
       memory to be shared between 32- and 64-bit applications. */
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
    int32_t ut_session;           /* Session ID (getsid(2)),
                                     used for windowing */
    struct {
        int32_t tv_sec;           /* Seconds */
        int32_t tv_usec;          /* Microseconds */
    } ut_tv;                      /* Time entry was made */
#else
     long   ut_session;           /* Session ID */
     struct timeval ut_tv;        /* Time entry was made */
#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.

The first entries ever created result from init(1) processing inittab(5). Before an entry is processed, though, init(1) cleans up utmp by setting ut_type to DEAD_PROCESS, clearing ut_user, ut_host, and ut_time with null bytes for each record which ut_type is not DEAD_PROCESS or RUN_LVL and where no process with PID ut_pid exists. If no empty record with the needed ut_id can be found, init(1) creates a new one. It sets ut_id from the inittab, ut_pid and ut_time to the current values, and ut_type to INIT_PROCESS.

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.

When init(1) finds that a process has exited, it locates its utmp entry by ut_pid, sets ut_type to DEAD_PROCESS, and clears ut_user, ut_host and ut_time with 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.

The wtmp file records all logins and logouts. Its format is exactly like utmp except that a null username indicates a logout on the associated terminal. Furthermore, the terminal name ~ with username shutdown or reboot indicates a system shutdown or reboot and the pair of terminal names |/} logs the old/new system time when date(1) changes it. wtmp is maintained by login(1), init(1), and some versions of getty(8) (e.g., mingetty(8) or agetty(8)). None of these programs creates the file, so if it is removed, record-keeping is turned off.

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), last(1), login(1), utmpdump(1), who(1), getutent(3), getutmp(3), login(3), logout(3), logwtmp(3), updwtmp(3), init(1)

KOLOPHON
This page is part of release 3.80 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at http://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>.