UTMP(5)

NOM
utmp, wtmp - Enregistrements de connexion

SYNOPSIS
#include <utmp.h>

DESCRIPTION
Le fichier utmp permet de voir qui est connecté sur le système. Tous les programmes n'utilisant pas les enregistrement utmp, il se peut qu'il y ait plus d'utilisateurs que ceux affichés.

Attention : utmp ne doit pas être accessible en écriture car de nombreux programmes systèmes dépendent (malheureusement) de son intégrité. En laissant utmp accessible en écriture pour les utilisateurs, vous prenez le risque d'avoir de mauvais fichiers de journalisation, et des modifications de fichiers système.

Le fichier est une suite d'enregistrements avec la structure suivante (remarquez que les détails d'implémentation dépendent d'une version à l'autre de la bibliothèque C) :

/* Values for ut_type field, below */
#define EMPTY         0 /* Record does not contain valid info
                           (formerly known as UT_UNKNOWN on Linux) */
#define RUN_LVL       1 /* Change in system run-level (see
                           init(8) */
#define BOOT_TIME     2 /* Time of system booy (in ut_tv) */
#define NEW_TIME      3 /* Time after system clock change
                           (in ut_tv) */
#define OLD_TIME      4 /* Time before system clock change
                           (in ut_tv) */
#define INIT_PROCESS  5 /* Process spawned by init(8) */
#define LOGIN_PROCESS 6 /* Session leader process for user login */
#define USER_PROCESS  7 /* Normal process */
#define DEAD_PROCESS  8 /* Terminated process */
#define ACCOUNTING    9 /* Not implemented */
#define UT_LINESIZE      32
#define UT_NAMESIZE      32
#define UT_HOSTSIZE     256
struct exit_status {            /* Type pour ut_exit ci-dessous */
    short int e_termination;    /* Code de fin du processus */
    short int e_exit;           /* Valeur de fin du processus */
};
struct utmp {
    short   ut_type;              /* Type d'enregistrement */
    pid_t   ut_pid;               /* PID du processus */
    char    ut_line[UT_LINESIZE]; /* Nom du périphérique tty - « /dev/ » */
    char    ut_id[4];             /* Suffixe du nom de terminal,
                                     ou identifiant inittab(5)
    char    ut_user[UT_NAMESIZE]; /* Nom d'utilisateur */
    char    ut_host[UT_HOSTSIZE]; /* Nom d'hôte pour connexion distante, ou
                                     version du noyau pour les messages du
                                     niveau d'exécution (run-level) */
    struct  exit_status ut_exit;  /* Code de fin d'un processus
                                     déjà marqué DEAD_PROCESS ;
                                     pas utilisé par init(8) de Linux. */
    /* Les champs ut_session et ut_tv fields doivent avoir la même
       taille compilés en 32 et 64 bits. Cela permet aux fichiers
       de données et à la mémoire partagée d'être partagés entre
       les applications 32 et 64 bits. */
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
    int32_t ut_session;           /* ID de session  (getsid(2)),
                                     utilisé pour le fenêtrage */
    struct {
        int32_t tv_sec;           /* Secondes */
        int32_t tv_usec;          /* Microsecondes */
    } ut_tv;                      /* Horodatage */
#else
    long int ut_session;          /* ID de session */
    struct timeval ut_tv;         /* Horodatage */
#endif
    int32_t ut_addr_v6[4];        /* Adresse IP hôte distant ; les adresses IPv4
                                     utilisent seulement ut_addr_v6[0] */
    char __unused[20];            /* Réservé pour utilisation future */
};
/* Bidouille pour compatibilité ascendante  */
#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]

Cette structure donne le nom du fichier spécial associé au terminal de l'utilisateur, le nom d'utilisateur, l'heure de connexion sous la forme time(2). Les chaînes de caractères se terminent par « \0 » si elles sont plus courtes que les longueurs définies dans la structure.

Le premier enregistrement créé est le traitement de inittab(5) par init(8). Néanmoins, avant ça, init(8) positionne le champ ut_type à DEAD_PROCESS, et efface ut_user, ut_host et ut_time (remplis avec des octets nuls) 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 trouvé avec le ut_id correct, init(8) en crée un nouveau. Il positionne ut_id en s'aidant de l'inittab, ut_pid et ut_time avec les valeurs actuelles et ut_type à INIT_PROCESS.

getty(8) (par exemple, mingetty(8) ou agetty(8)) récupère l'entrée correspondant à son PID, positionne ut_type à la valeur LOGIN_PROCESS, modifie ut_time, positionne ut_line et attend une connexion. Une fois qu'un utilisateur est authentifié, login(1) modifie ut_type à USER_PROCESS, modifie ut_time et positionne ut_host et ut_addr. En fonction du mingetty(8) et login(1) utilisés, les enregistrements sont parfois identifiés par ut_line plutôt que ut_pid qui est toutefois préférable.

Quand init(8) s'aperçoit qu'un processus est terminé, il identifie son enregistrement utmp grâce au champ ut_pid, positionne ut_type à DEAD_PROCESS et efface ut_user, ut_host et ut_time avec des octets nuls.

xterm(1) (comme les autres émulateurs de terminaux) crée directement un enregistrement USER_PROCESS, engendrant ut_id grâce à la chaîne qui suffixe le nom du terminal (les caractères qui suivent /dev/[pt]ts. S'il trouve un DEAD_PROCESS pour cet ID, il le recycle, sinon il en crée un nouveau. Si possible, il marque l'enregistrement avec DEAD_PROCESS à la sortie. Il est recommandé qu'il efface également ut_line, ut_time, ut_user et ut_host.

telnetd(8) construit un enregistrement LOGIN_PROCESS et laisse le reste du travail à login(1). Une fois que la session telnet est terminée, telnetd(8) efface l'utmp de la manière décrite plus haut.

Le fichier wtmp enregistre les connexions et déconnexions. Son format est exactement le même que utmp excepté qu'un utilisateur nul indique une déconnexion sur le terminal associé. De plus, un nom de terminal « ~ » associé à un nom d'utilisateur « shutdown » ou « reboot » indique un arrêt ou un redémarrage du système. Une paire d'enregistrements avec les noms de terminaux « |/} » indique une modification de l'heure système avec date(1). Le fichier wtmp est maintenu par login(1), init(8) et quelques uns des mingetty(8) (ou agetty(8)). Aucun de ces programmes ne crée le fichier. Aussi, si on le supprime, les enregistrements de connexions sont arrêtés.

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

CONFORMITÉ

POSIX.1 ne spécifie pas de structure utmp, mais une appelée utmpx, avec des spécifications pour les champs ut_type, ut_pid, ut_line, ut_id, ut_user et ut_tv. POSIX.1 ne spécifie pas les tailles des champs ut_line et ut_user. Linux définit la structure utmpx comme étant la même que la structure utmp.

  Comparaison avec des systèmes historiques
Les enregistrements utmp de Linux ne se conforment ni à v7/BSD ni à System V. Ils sont en réalité un mélange des deux. v7/BSD dispose de moins de champs, par exemple pas de ut_type, ce qui conduit les programmes pour v7/BSD à afficher des entrées invalides de login. Sous Linux (comme sous System V), le champ ut_id d'un enregistrement ne sera jamais modifié après son initialisation. L'effacement de ut_id peut engendrer des conditions de concurrence menant à l'endommagement des enregistrements utmp.

System V n'a pas de champ ut_host ni ut_addr_v6.

NOTES

Contrairement à d'autres systèmes, sur lesquels l'effacement du fichier arrête la journalisation, le fichier utmp doit toujours exister sous Linux. Si vous désirez désactiver who(1), laissez le fichier utmp en place, mais ne le laissez pas lisible par tout le monde.

Le format de ces fichiers dépend de la machine, et il est recommandé de ne les utiliser que sur la machine où ils ont été créés.

Notez que sur les plates-formes sur lesquelles on peut exécuter des applications 32 bits et 64 bits (x86-64, ppc64, s390x, etc.), les tailles des champs d'une structure utmp doivent être les mêmes dans les modes 32 bits et 64 bits. c'est la même chose pour ut_session et ut_time s'ils sont présents. Cela permet aux applications 32 bits et 64 bits de se partager les fichiers de données et la mémoire partagée. Cela est fait en modifiant le type de ut_session en int32_t, et celui de ut_tv en une structure avec deux champs int32_t, tv_sec et tv_usec. Puisque la structure ut_tv est différente de la structure timeval, au lieu de l'appel

gettimeofday((struct timeval *) &ut.ut_tv, NULL);
on vous recommande la méthode suivante pour définir ce champ :

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;

Veuillez noter que la structure utmp de la libc5 a été modifié dans la libc6. À cause de cela, l'utilisation de l'ancienne structure de la libc5 corrompra les fichiers /var/run/utmp et/ou /var/log/wtmp.

BOGUES
Cette page de manuel est basée sur la libc5, et les choses fonctionnent peut-être différemment à présent.

VOIR AUSSI
ac(1), date(1), last(1), login(1), who(1), getutent(3), getutmp(3), login(3), logout(3), logwtmp(3), updwtmp(3), init(8)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 18 octobre 1996 et révisée le 17 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 5 utmp ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.