Login Accounting sous Linux/UNIX

Ce forum est dédié à apprendre le développement de programmes user mode sur Linux

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 114
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

Login Accounting sous Linux/UNIX

Post by Hydraxx »

Login Accounting sous Linux/UNIX

Le système conserve des informations sur les utilisateurs connectés et sur l'historique des connexions grâce principalement à trois fichiers : utmp, wtmp et lastlog.

1. Les fichiers principaux

utmp

Contient l'état actuel des sessions.
  • utilisateurs actuellement connectés ;
  • terminal utilisé ;
  • PID associé ;
  • heure de connexion ;
  • éventuellement l'hôte distant.
Des commandes comme who utilisent ces informations.

wtmp

Conserve un historique des connexions et déconnexions.

Contrairement à utmp, les anciennes entrées ne sont pas simplement remplacées : elles sont ajoutées au journal.

La commande last exploite notamment ce fichier.

lastlog

Conserve la dernière connexion connue de chaque utilisateur.

Il contient notamment :
  • l'heure de la dernière connexion ;
  • le terminal ;
  • éventuellement l'hôte distant.
2. La structure utmpx

Les entrées utmp/wtmp sont représentées par :

Code: Select all

#include <utmpx.h>

struct utmpx;
Champs importants :
  • ut_type : type de l'entrée ;
  • ut_pid : PID associé ;
  • ut_line : terminal, par exemple tty1 ou pts/0 ;
  • ut_id : identifiant du terminal ou de la session ;
  • ut_user : nom de l'utilisateur ;
  • ut_host : hôte distant ;
  • ut_session : identifiant de session ;
  • ut_tv : date et heure.
3. Types d'entrées importants

Le champ ut_type indique ce que représente l'entrée.

Valeurs principales :

Code: Select all

USER_PROCESS    // utilisateur connecté
LOGIN_PROCESS   // processus de login
DEAD_PROCESS    // session/processus terminé
INIT_PROCESS    // processus créé par init
BOOT_TIME       // démarrage du système
OLD_TIME        // ancienne heure système
NEW_TIME        // nouvelle heure système
Pour les connexions utilisateur, les plus importantes sont surtout :

Code: Select all

USER_PROCESS
DEAD_PROCESS
4. Parcourir les entrées utmpx

setutxent()

Replace la lecture au début du fichier utmp.

Code: Select all

setutxent();
getutxent()

Lit l'entrée suivante.

Code: Select all

struct utmpx *entry;

while ((entry = getutxent()) != NULL) {
    // utiliser entry
}
La fonction retourne un pointeur vers une structure interne statique.

endutxent()

Termine l'utilisation du fichier utmp.

Code: Select all

endutxent();
Schéma classique :

Code: Select all

setutxent();

while ((entry = getutxent()) != NULL) {
    ...
}

endutxent();
5. Rechercher une entrée précise

getutxid()

Recherche une entrée correspondant à certains champs d'une structure utmpx, principalement selon ut_type ou ut_id.

Code: Select all

struct utmpx *getutxid(const struct utmpx *ut);
getutxline()

Recherche une entrée associée à un terminal.

Code: Select all

struct utmpx *getutxline(const struct utmpx *ut);
Elle sert principalement à trouver une session de type :

Code: Select all

LOGIN_PROCESS
USER_PROCESS
6. Utiliser un autre fichier utmp

utmpxname()

Permet de demander aux fonctions utmpx d'utiliser un autre fichier.

Code: Select all

utmpxname("/chemin/fichier");
Les appels suivants comme getutxent() utiliseront alors ce fichier.

7. Ajouter ou modifier une entrée

pututxline()

Écrit ou met à jour une entrée dans le fichier utmp.

Code: Select all

pututxline(&entry);
Lors d'une connexion, une entrée de type :

Code: Select all

USER_PROCESS
peut être enregistrée.

Lors d'une déconnexion, elle devient typiquement :

Code: Select all

DEAD_PROCESS
updwtmpx()

Ajoute une entrée au journal wtmp.

Code: Select all

updwtmpx(_PATH_WTMP, &entry);
On peut donc résumer ainsi :

Code: Select all

utmp = état actuel
wtmp = historique
8. getlogin()

getlogin()

Retourne le nom de l'utilisateur associé au terminal de contrôle du processus.

Code: Select all

#include <unistd.h>

char *name = getlogin();
Important : getlogin() ne correspond pas forcément à l'utilisateur effectif du processus.

Par exemple, après un changement d'UID ou avec sudo, l'UID effectif peut être différent du propriétaire initial de la session du terminal.

La fonction peut aussi échouer si :
  • le processus n'a pas de terminal de contrôle ;
  • aucune entrée correspondante n'existe dans utmp.
9. lastlog

Le fichier lastlog conserve la dernière connexion de chaque utilisateur.

Une entrée contient essentiellement :

Code: Select all

struct lastlog {
    time_t ll_time;
    char ll_line[];
    char ll_host[];
};
Il permet de retrouver :
  • la date de dernière connexion ;
  • le terminal utilisé ;
  • l'hôte distant.
Les entrées sont associées aux utilisateurs, généralement via leur UID.

10. Résumé

À retenir :
  • utmp : utilisateurs actuellement connectés ;
  • wtmp : historique des connexions et déconnexions ;
  • lastlog : dernière connexion de chaque utilisateur.
API principales :
  • setutxent()
  • getutxent()
  • getutxid()
  • getutxline()
  • pututxline()
  • endutxent()
  • utmpxname()
  • updwtmpx()
  • getlogin()
Le point essentiel est de comprendre que Linux/UNIX conserve à la fois l'état courant des sessions et leur historique, et que l'API utmpx permet de lire ou mettre à jour ces informations.

Who is online

Users browsing this forum: No registered users and 1 guest