Provided by:
manpages-de_0.10-1_all 
BEZEICHNUNG
utmp, wtmp - login Eintrage
Diese Handbuchseite ist eventuell veraltet. Im Zweifelsfall ziehen Sie
die englischsprachige Handbuchseite zu Rate, indem Sie
man -LC 5 utmp
eingeben.
"UBERSICHT
#include <utmp.h>
BESCHREIBUNG
Die utmp Datei gibt Auskunft daruber, 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 abhangig sind. Falls
Sie utmp fur jeden schreibbar lassen, riskieren Sie falsche Eintrage in
Systemlogdateien und Modifikationen von Systemdateien.
Die Datei besteht aus einer Sequenz von Eintragen der Struktur utmp,
die uber die Include-Datei deklariert wird. Das Format von utmp ist
nicht strikt festgelegt, sondern hangt 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; /* Ruckgabestatus des Prozesses. */
};
struct utmp {
short int ut_type; /* Typ des Eintrags */
pid_t ut_pid; /* Kennung des Anmeldeprozesses */
char ut_line[UT_LINESIZE]; /* Geratename - "/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; /* Ruckgabestatus 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 fur spatere
Verwendung. */
};
Diese Struktur enthalt den Namen der Geratedatei fur 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 kurzer als das Feld sind, das sie enthalt.
Die ersten Eintrage, die je erstellt werden, entstehen durch init(8),
der inittab(5) verarbeitet. Bevor ein solcher Eintrag verarbeitet
wird, raumt init(8) utmp auf, indem bei jedem Eintrag dessen ut_type
nicht DEAD_PROCESS oder RUN_LVL ist und fur 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 gefullt werden. Falls kein
leerer Eintrag mit der benotigten ut_id gefunden wird, erstellt init
einen. Dabei wird ut_id von inittab ubernommen, 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, andert ut_type zu
LOGIN_PROCESS, andert ut_time, setzt ut_line und wartet darauf, dass
eine Verbindung hergestellt wird. Nachdem login(8) einen Benutzer
authentifizieren konnte, andert es ut_type zu USER_PROCESS, andert
ut_time und setzt ut_host und ut_addr. Je nach getty(8) und login(8)
konnten Eintrage 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 fullt 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 fur diese ID finden, wird er wieder
benutzt, ansonsten wird ein neuer Eintrag erstellt. Falls moglich,
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
fullen.
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 lasst 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) geandert wird. wtmp wird durch login(1), init(8)
und getty(1) verwaltet. Keins dieser Programme erstellt die Datei, so
dass, falls sie geloscht wird, keine Aufzeichnungen mehr gemacht
werden.
DATEIEN
/var/run/utmp
/var/log/wtmp
KONFORM ZU
Linux utmp Eintrage 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 ursprungliche v7/BSD-ahnliche Programme veranlaBt,
tote und login-Eintrage 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 geandert, wodurch diese Eintragnummer ohne jede
Konfigurationsdatei reserviert wird. ut_id zu loschen fuhrt zu Race-
Conditions und resultiert in beschadigten utmp Eintragen und
potenziellen Sicherheitslochern. Die SYSV-Semantik verlangt nicht, die
oben angegebenen Felder mit Null-Bytes zu loschen, aber es erlaubt
viele Programme zu benutzen, die die BSD-Semantik benutzen und utmp
nicht verandern. Wie beschrieben, benutzt Linux die BSD-Konventionen
fur Leitungsnamen. SYSV benutzt nur das Typ-Feld um solche Eintrage 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 Loschen der Datei abgeschaltet werden konnen, muss
utmp bei Linux immer vorhanden sein. Falls who(1) verboten werden
soll, dann kann man utmp einfach nicht allgemein lesbar machen.
EINSCHR"ANKUNGEN
Das Dateiformat ist maschinengebunden. Es wird daher empfohlen, dass
es nur auf der Architektur verarbeitet wird, auf der es erstellt wurde.
FEHLER
Ein GroBteil der obigen Beschreibung basiert auf der libc5. Aktuelle
Versionen konnten inzwischen ein anderes Verfahren verwenden.
SIEHE AUCH
ac(1), date(1), last(1), login(1), who(1), getutent(3), updwtmp(3),
init(8).