utmp(5) File Formats Manual utmp(5) NOM utmp, wtmp - Enregistrements de connexion SYNOPSIS #include 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 par la classe d'utilisateurs << autres >>, car de nombreux programmes systemes dependent (malheureusement) de son integrite. En laissant utmp accessible en ecriture pour les utilisateurs n'etant ni le proprietaire ni dans le groupe proprietaire, vous prenez le risque d'avoir de mauvais fichiers de journalisation et des modifications de fichiers systeme. Le fichier est une suite de structures utmp, declarees comme ceci dans (notez qu'il ne s'agit que d'une des definitions existantes ; les details dependent de la version de la bibliotheque 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(1)) */ #define BOOT_TIME 2 /* Time of system boot (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(1) */ #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 for ut_exit, below */ short e_termination; /* Process termination status */ short e_exit; /* Process exit status */ }; struct utmp { short ut_type; /* Type of record */ pid_t ut_pid; /* PID of login process */ char ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */ char ut_id[4]; /* Terminal name suffix, or inittab(5) ID */ char ut_user[UT_NAMESIZE]; /* Username */ char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or kernel version for run-level messages */ struct exit_status ut_exit; /* Exit status of a process marked as DEAD_PROCESS; not used by Linux init(1) */ /* The ut_session and ut_tv fields must be the same size when compiled 32- and 64-bit. This allows data files and shared memory to be shared between 32- and 64-bit applications. */ #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32 int32_t ut_session; /* Session ID ( getsid(2)), used for windowing */ struct { int32_t tv_sec; /* Seconds */ int32_t tv_usec; /* Microseconds */ } ut_tv; /* Time entry was made */ #else long ut_session; /* Session ID */ struct timeval ut_tv; /* Time entry was made */ #endif int32_t ut_addr_v6[4]; /* Internet address of remote host; IPv4 address uses just ut_addr_v6[0] */ char __unused[20]; /* Reserved for future use */ }; /* Backward compatibility hacks */ #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 special associe au terminal de l'utilisateur, le nom d'utilisateur, l'heure de connexion sous la forme time(2). Les chaines de caracteres se terminent par un octet nul << \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(1). Neanmoins, avant ca, init(1) positionne le champ ut_type a 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 trouve avec le ut_id correct, init(1) 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. mingetty(8) (ou agetty(8)) recupere l'entree correspondant a son PID, donne a ut_type la valeur LOGIN_PROCESS, modifie ut_time, definit ut_line et attend l'etablissement d'une connexion. Une fois qu'un utilisateur a ete authentifie, login(1) donne a ut_type la valeur USER_PROCESS, modifie ut_time et definit ut_host et ut_addr. Selon les utilitaires mingetty(8) (ou agetty(8)) et login(1) utilises, les enregistrements sont parfois identifies par ut_line plutot que ut_pid, qui est preferable. Quand init(1) 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), et d'autres emulateurs de terminaux, creent directement un enregistrement USER_PROCESS, engendrant ut_id grace a la chaine qui suffixe le nom du terminal (les caracteres qui suivent /dev/[pt]ty). S'ils trouvent un DEAD_PROCESS correspondant a cet ID, ils le recycle, sinon ils en creent un nouveau. Si possible, ils marquent l'enregistrement comme etant DEAD_PROCESS lorsqu'ils se terminent et il faut tenir compte du fait qu'ils effacent egalement ut_line, ut_time, ut_user et ut_host. telnetd(8) construit un enregistrement LOGIN_PROCESS et laisse le reste du travail a login(1). 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 avec date(1). Le fichier wtmp est maintenu par login(1), init(1) et quelques uns des getty(8) (par exemple mingetty(8) ou agetty(8)). Aucun de ces programmes ne cree le fichier. Aussi, si on le supprime, les enregistrements de connexions sont arretes. FICHIERS /var/run/utmp /var/log/wtmp VERSIONS POSIX.1 ne specifie pas de structure utmp, mais une appelee utmpx (comme element de l'extension XSI), avec des specifications pour les champs ut_type, ut_pid, ut_line, ut_id, ut_user et ut_tv. POSIX.1 ne specifie pas les tailles des champs ut_line et ut_user. Linux definit la structure utmpx comme etant la meme que la structure utmp. NORMES Linux. HISTORIQUE Les enregistrements utmp de Linux ne se conforment ni a v7/BSD ni a System V. Ils sont en realite un melange des deux. v7/BSD comporte moins de champs ; par exemple pas de ut_type, ce qui conduit les programmes natifs de v7/BSD a afficher des entrees (par exemple) des entrees << mortes >> ou d'identification (<< login >>). De plus, il n'y a pas de fichier de configuration pour allouer les slots aux sessions. BSD le fait parce qu'il lui manque le champ ut_id. Sous Linux (comme sous System 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 conduisant a avoir des entrees utmp corrompues et, potentiellement, des trous de securite. Effacer les champs mentionnes ci-dessus en les remplissant avec des zeros binaires n'est pas requis par la semantique de System V, mais cela permet l'execution de nombreux programmes qui s'appuient sur la semantique de BSD et qui ne modifient pas utmp. Linux utilise les conventions BSD en ce qui concerne le contenu des lignes, tels que c'est precise plus haut. System V n'a pas de champ ut_host ni ut_addr_v6. NOTES 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), laissez le fichier utmp en place, mais ne le laissez pas lisible par tout le monde. 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. Note that on biarch platforms, that is, systems which can run both 32-bit and 64-bit applications (x86-64, ppc64, s390x, etc.), ut_tv is the same size in 32-bit mode as in 64-bit mode. The same goes for ut_session and ut_time if they are present. This allows data files and shared memory to be shared between 32-bit and 64-bit applications. This is achieved by changing the type of ut_session to int32_t, and that of ut_tv to a struct with two int32_t fields tv_sec and tv_usec. Since ut_tv may not be the same as struct timeval, then instead of the call: gettimeofday((struct timeval *) &ut.ut_tv, NULL); il est recommande d'utiliser la methode suivante pour definir 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; VOIR AUSSI ac(1), date(1), init(1), last(1), login(1), logname(1), lslogins(1), users(1), utmpdump(1), who(1), getutent(3), getutmp(3), login(3), logout(3), logwtmp(3), updwtmp(3) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Jean-Baptiste Holcroft , Gregoire Scano et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.18 21 septembre 2025 utmp(5)