UTMP(5)

NOM
utmp, wtmp - Enregistrements de connexion.

SYNOPSIS
#include <utmp.h>

DESCRIPTION
Le fichier utmp permet de voir qui est connecte sur le systeme. Tous les programmes n'utilisant pas les enregistrement utmp, il se peut qu'il y ait plus d'utilisateurs que ceux affiches.

Attention : utmp ne doit pas etre accessible en ecriture car de nombreux programmes systemes dependent de son integrite. En laissant utmp accessible en ecriture pour les utilisaters, vous prenez le risque d'avoir de mauvais fichiers de journalisation, et d'obtenir des modifications de fichiers systeme.

Le fichier est une suite d'enregistrement avec la structure suivante :

    #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 UT_LINESIZE	12
    #define UT_NAMESIZE	8
    #define UT_HOSTSIZE	16
    struct utmp {
      short ut_type;              /* type de login              */
      pid_t ut_pid;               /* pid du processus           */
      char ut_line[UT_LINESIZE];  /* peripherique tty - "/dev/" */
      char ut_id[2];              /* ID tty initial             */
      time_t ut_time;             /* heure de login             */
      char ut_user[UT_NAMESIZE];  /* nom utilisateur            */
      char ut_host[UT_HOSTSIZE];   /* nom hote si login distant */
      long ut_addr;                /* Adresse IP hote distant   */
    };

Cette structure donne le nom du fichier special associe au terminal de l'utilisateur, le nom d'utilisateur, l'heure de connexion sous la forme time(2). Les chaine des caracteres se termine par '\0' si elles sont plus courtes que les longueurs definies dans la structure.

Le premier enregistrement cree est le traitement de inittab(5) par init(8). Neanmoins, avant ca, init(8) positionne le champ ut_type a DEAD_PROCESS, et efface ut_user, ut_host et ut_time (remplis avec des octets nul) de tous les enregistrement dont l'ut_type n'est ni DEAD_PROCESS ni RUN_LVL, et si aucun processus de PID ut_pid n'existe. Si aucun enregistrement vide n'est trouve avec le ut_id correct, init en cree un nouveau. Il positionne ut_id en s'aidant de l'inittab, ut_pid et ut_time avec les valeurs actuelles et ut_type a INIT_PROCESS.

getty(8) recupere l'entree corespondant a son PID, modifie ut_type a la valeur LOGIN_PROCESS, modifie ut_time, positionne ut_line et attend une connexion. Une fois qu'un utilisateur est authentifie, login(8) modifie ut_type a USER_PROCESS, modifie ut_time et positionne ut_host et ut_addr. En fonction du getty(8) et login(8) utilise, les enregistrements sont parfois identifies par ut_line plutot que ut_pid qui est toutefois preferable.

Quand init(8) s'apercoit qu'un processus est termine, il identifie son enregistrement utmp grace au champ ut_pid, positionne ut_type a DEAD_PROCESS et efface ut_user, ut_host et ut_time avec des octets nuls.

xterm(1) (comme les autres emulateurs de terminaux) cree directement un enregistrement USER_PROCESS, engendrant ut_id grace aux deux dernieres lettres de /dev/ttyp%c ou en utilisant p%d pour /dev/pts/%d. S'il trouve un DEAD_PROCESS pour cet ID, il le recycle, sinon il en cree un nouveau. Si possible, il marque l'enregistrement avec DEAD_PROCESS a la sortie. Il est recommande qu'il efface egalement ut_line, ut_time, ut_user et ut_host.

xdm(8) ne doit pas creer d'enregistrement car il n'y a pas de terminal associe. Le forcer a en creer peut declencher des problemes, tels que l'impossibilite de faire fonctionner finger. Par contre xdm peut tres bien creer des entrees wtmp tout comme ftpd(8).

telnetd(8) construit un enregistrement LOGIN_PROCESS et laisse le reste du travail a login(8). Une fois que la session telnet est terminee, telnetd(8) efface l'utmp de la maniere decrite plus haut.

Le fichier wtmp enregistre les connexions et deconnexions. Son format est exactement le meme que utmp excepte qu'un utilisateur nul indique une deconnexion sur le terminal associe. De plus un nom de terminal "~", associe a un nom d'utilisateur "shutdown" ou "reboot" indique un arret ou un redemarrage du systeme. Une paire d'enregistrements avec les noms de terminaux "|" / "}" indique une modification de l'heure systeme. Le fichier wtmp est maintenu par login(1), init(1) et quelques un des getty(1). Aucun de ces programmes ne cree le fichier, aussi sil on le supprime, les enregistrements de connexions sont arretes.

FICHIERS
/var/run/utmp
/var/run/wtmp

CONFORME A
Les enregistrements utmp de Linux ne se conforment ni a v7/BSD ni a SYSV. Ils sont en realite un melange des deux. v7/BSD dispose de moins de champs, par exemple pas de ut_type, ce qui conduit les programmes pour v7/BSD a afficher des entrees invalides de login. Sous Linux (comme sous SYS V), le champ ut_id d'un enregistrement ne sera jamais modifie apres son initialisation. L'effacement de ut_id peut engendrer des conditions de concurrence menant a l'endommagement des enregistrements utmp. SYSV dispose d'un champ supplementaire pour enregistrer le statut de sortie des processus. UT_UNKNOWN semble etre une inovation de Linux. Par contre, il n'y a pas de type ACCOUNTING sous Linux. Contrairement a d'autres systemes, sur lesquels l'effacement du fichier arrete la journalisation, le fichier utmp doit toujours exister sous Linux. Si vous desirez desactiver who(1) alors laissez le fichier utmp en place, mais ne le laissez pas lisible par tout le monde.

RESTRICTIONS
Le format de ces fichiers depend de la machine, et il est recommande de ne les utiliser que sur la machine ou ils ont ete crees.

VOIR AUSSI
ac(1), date(1), last(1), login(1), who(1), getutent(3), init(8)