Provided by: manpages-de_0.10-1_all bug

BEZEICHNUNG

       utmp, wtmp - login Einträge

       Diese   Handbuchseite   ist   eventuell   veraltet.   Im   Zweifelsfall   ziehen  Sie  die
       englischsprachige Handbuchseite zu Rate, indem Sie

              man -LC 5 utmp

       eingeben.

ÜBERSICHT

       #include <utmp.h>

BESCHREIBUNG

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

       Warnung:  utmp  darf  nicht  allgemein schreibbar sein, weil viele Systemprogramme von der
       Korrektheit dieser Datei abhängig sind.  Falls  Sie  utmp  für  jeden  schreibbar  lassen,
       riskieren Sie falsche Einträge in Systemlogdateien und Modifikationen von Systemdateien.

       Die Datei besteht aus einer Sequenz von Einträgen der Struktur utmp, die über die Include-
       Datei deklariert wird. Das Format von utmp ist nicht strikt festgelegt, sondern  hängt  ab
       von der Version der verwendeten libc. Das folgende Beispiel ist glibc 2.2.5 entnommen:

              #define UT_UNKNOWN            0
              #define RUN_LVL               1
              #define BOOT_TIME             2
              #define NEW_TIME              3
              #define OLD_TIME              4
              #define INIT_PROCESS          5
              #define LOGIN_PROCESS         6
              #define USER_PROCESS          7
              #define DEAD_PROCESS          8
              #define ACCOUNTING            9

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

              struct exit_status {
                short int e_termination;    /* Abbruchstatus des Prozesses. */
                short int e_exit;           /* Rückgabestatus des Prozesses. */
              };

              struct utmp {
                short int ut_type;          /* Typ des Eintrags */
                pid_t ut_pid;               /* Kennung des Anmeldeprozesses */
                char ut_line[UT_LINESIZE];  /* Gerätename - "/dev/" */
                char ut_id[4];              /* init id or abgek. Leitungsname */
                char ut_user[UT_NAMESIZE];  /* Benutzer login-Name */
                char ut_host[UT_HOSTSIZE];  /* Rechner-Name bei remote login */
                struct exit_status ut_exit; /* Rückgabestatus eines Prozesses, der
                                               als DEAD_PROCESS markiert ist. */
                long int ut_session;        /* Sessionkennung, benutzt, um mehrere
                                               Fenster zu unterscheiden. */
                struct timeval ut_tv;       /* Zeit, zu der der Eintrag erstellt
                                               wurde. */
                int32_t ut_addr_v6[4];      /* Internetadresse des Ursprungsrechners
                                               der Login-Verbindung. */
                char __unused[20];          /* Unbenutzt, reserviert für spätere
                                               Verwendung. */
              };

       Diese  Struktur  enthält  den Namen der Gerätedatei für das Terminal des Benutzers, seinen
       Login-Namen und den Zeitpunkt im Format von  time(2),  an  dem  er  sich  eingeloggt  hat.
       Zeichenketten  sind  mit  '\0'  terminiert,  falls  sie  kürzer als das Feld sind, das sie
       enthält.

       Die ersten Einträge, die je erstellt  werden,  entstehen  durch  init(8),  der  inittab(5)
       verarbeitet. Bevor ein solcher Eintrag verarbeitet wird, räumt init(8) 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 Eintrag  mit  der  benötigten
       ut_id  gefunden wird, erstellt init einen. Dabei wird ut_id von inittab übernommen, ut_pid
       und ut_time auf die aktuellen Werte und ut_type auf INIT_PROCESS gesetzt wird.

       getty(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(8) einen Benutzer authentifizieren konnte, ändert es ut_type zu USER_PROCESS, ändert
       ut_time und setzt ut_host und ut_addr. Je nach getty(8) und login(8) könnten Einträge auch
       mittels ut_line anstatt der vorzuziehenden ut_pid gefunden werden.

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

       xterm(1) und andere Terminal-Emulatoren erstellen direkt einen USER_PROCESS-  Eintrag  und
       erzeugen  die  ut_id  entweder durch die letzten beiden Zeichen von /dev/ttyp%c oder durch
       p%d bei /dev/pts/%d. Falls sie einen DEAD_PROCESS- Eintrag 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 mit Nullen füllen.

       xdm(8)  sollte  keinen  utmp-Eintrag  erstellen,  weil es kein zugeordnetes Terminal gibt.
       Falls  es  trotzdem  gemacht  wird,  werden  Fehlermeldungen  wie  finger:   cannot   stat
       /dev/machine.dom  die  Folge sein. Es sollte jedoch ein wtmp Eintrag erzeugt werden, genau
       wie es auch bei ftpd(8) geschieht.

       telnetd(8) erzeugt einen LOGIN_PROCESS-Eintrag und  lässt  login(8)  den  Rest  erledigen.
       Nachdem  die telnet-Sitzung beendet ist, markiert telnetd(8) den utmp- Eintrag in der oben
       beschriebenen Art und Weise.

       Die wtmp Datei zeichnet alle An- und Abmeldungen im System auf. Das Format  gleicht  utmp,
       mit  der  Ausnahme,  dass  ein leerer Benutzername eine Abmeldung vom angegebenen Terminal
       anzeigt. Weiterhin bedeutet die Terminalleitung "~" mit dem Benutzernamens "shutdown" oder
       "reboot"   ein   Herunterfahren   bzw.   den   Neustart  des  Systems  und  das  Paar  der
       Terminalleitungen "|"/"}" zeichnet die alte/neue Systemzeit auf, wenn diese durch  date(1)
       geändert  wird.  wtmp  wird  durch  login(1), init(8) und getty(1) verwaltet. Keins dieser
       Programme erstellt die Datei, so dass, falls sie gelöscht wird, keine Aufzeichnungen  mehr
       gemacht werden.

DATEIEN

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

KONFORM ZU

       Linux  utmp  Einträge sind weder zu v7/BSD noch zu SYSV konform: Sie sind eine Vereinigung
       von beidem. v7/BSD hat weniger Felder, vor allem fehlt ut_type, was ursprüngliche  v7/BSD-
       ähnliche  Programme veranlaßt, tote und login-Einträge anzuzeigen. Weiterhin gibt es keine
       Konfigurationsdatei, die jeder Session eine Eintragsnummer  zuordnet.  Dies  wird  in  BSD
       gemacht, weil dort ut_id fehlt. In Linux (wie in SYSV), wird das ut_id Feld eines Eintrags
       nach dem initialen Setzen nie wieder  geändert,  wodurch  diese  Eintragnummer  ohne  jede
       Konfigurationsdatei  reserviert  wird.  ut_id  zu  löschen  führt  zu  Race-Conditions und
       resultiert in beschädigten utmp Einträgen und potenziellen Sicherheitslöchern.  Die  SYSV-
       Semantik  verlangt  nicht,  die oben angegebenen Felder mit Null-Bytes zu löschen, aber es
       erlaubt viele Programme  zu  benutzen,  die  die  BSD-Semantik  benutzen  und  utmp  nicht
       verändern.  Wie  beschrieben,  benutzt  Linux die BSD-Konventionen für Leitungsnamen. SYSV
       benutzt nur das Typ-Feld um solche Einträge zu markieren und zeichnet Meldungen  wie  "new
       time"  im  Leitungs-Feld  auf.  SYSV  hat  ein Feld mehr, um den Exit-Status von beendeten
       Prozessen aufzuzeichnen. UT_UNKNOWN scheint eine Linux Erfindung zu sein. In Linux gibt es
       keinen  ACCOUNTING  Typ.  SYSV  hat  kein  ut_host  oder  ut_addr  Feld.  Anders  als  bei
       verschiedenen  anderen  Systemen,  wo  utmp  Aufzeichnungen  durch   Löschen   der   Datei
       abgeschaltet  werden  können,  muss  utmp  bei  Linux  immer  vorhanden sein. Falls who(1)
       verboten werden soll, dann kann man utmp einfach nicht allgemein lesbar machen.

EINSCHRÄNKUNGEN

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

FEHLER

       Ein  Großteil  der  obigen  Beschreibung basiert auf der libc5. Aktuelle Versionen könnten
       inzwischen ein anderes Verfahren verwenden.

SIEHE AUCH

       ac(1), date(1), last(1), login(1), who(1), getutent(3), updwtmp(3), init(8).