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.
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.
Les entrées utmp/wtmp sont représentées par :
Code: Select all
#include <utmpx.h>
struct utmpx;
- 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.
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
Code: Select all
USER_PROCESS
DEAD_PROCESS
setutxent()
Replace la lecture au début du fichier utmp.
Code: Select all
setutxent();
Lit l'entrée suivante.
Code: Select all
struct utmpx *entry;
while ((entry = getutxent()) != NULL) {
// utiliser entry
}
endutxent()
Termine l'utilisation du fichier utmp.
Code: Select all
endutxent();
Code: Select all
setutxent();
while ((entry = getutxent()) != NULL) {
...
}
endutxent();
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);
Recherche une entrée associée à un terminal.
Code: Select all
struct utmpx *getutxline(const struct utmpx *ut);
Code: Select all
LOGIN_PROCESS
USER_PROCESS
utmpxname()
Permet de demander aux fonctions utmpx d'utiliser un autre fichier.
Code: Select all
utmpxname("/chemin/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);
Code: Select all
USER_PROCESS
Lors d'une déconnexion, elle devient typiquement :
Code: Select all
DEAD_PROCESS
Ajoute une entrée au journal wtmp.
Code: Select all
updwtmpx(_PATH_WTMP, &entry);
Code: Select all
utmp = état actuel
wtmp = historique
getlogin()
Retourne le nom de l'utilisateur associé au terminal de contrôle du processus.
Code: Select all
#include <unistd.h>
char *name = getlogin();
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.
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[];
};
- la date de dernière connexion ;
- le terminal utilisé ;
- l'hôte distant.
10. Résumé
À retenir :
- utmp : utilisateurs actuellement connectés ;
- wtmp : historique des connexions et déconnexions ;
- lastlog : dernière connexion de chaque utilisateur.
- setutxent()
- getutxent()
- getutxid()
- getutxline()
- pututxline()
- endutxent()
- utmpxname()
- updwtmpx()
- getlogin()
