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).