utmp(5)

NOME
utmp, wtmp - registri dei login

SINTASSI
#include <utmp.h>

DESCRIZIONE
Il file utmp permette di scoprire informazioni su chi sta usando attualmente il sistema. Ci possono essere più utenti che stanno usando il sistema di quelli riportati, poiché non tutti i programmi usano registrazioni utmp.

Attenzione: utmp non deve essere scrivibile dalla classe di utenti "other", poiché molti programmi di sistema dipendono (stupidamente) dalla sua integrità. Si rischia di avere file di log contraffatti e file di sistema modificati se si lascia utmp scrivibile da utenti che non siano il proprietario o il gruppo proprietario del file.

Il file è una sequenza di strutture utmp, dichiarate nel modo seguente in <utmp.h> (si noti che questa è solo una delle numerose definizioni in giro; i dettagli dipendono dalla versione di libc):

    /* 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]

Questa struttura dà il nome del file speciale associato al terminale utente, il nome di login dell'utente, e l'ora di login nel formato di time(2). I campi stringa sono terminati con un byte null ('\0') se sono più corti della dimensione del campo.

Le prime voci del file sono il risultato di init(1) quando elabora inittab(5). Prima che una voce sia eseguita, però, init(1) pulisce il file utmp assegnando il valore di DEAD_PROCESS a ut_type, pulendo ut_user, ut_host e ut_time con byte nulli per ogni registrazione il cui ut_type non sia DEAD_PROCESS o RUN_LVL, e quelle per cui non esistono processi con PID ut_pid. Se non si trovano registrazioni vuote con la ut_id necessaria, init(1) ne crea una nuova. Poi assegna ut_id dal file inittab, assegna i valori attuali a ut_pid e ut_time e assegna INIT_PROCESS a ut_type.

mingetty(8) (o agetty(8)) localizza le voci tramite il PID, cambia ut_type perché contenga LOGIN_PROCESS, aggiorna ut_time, assegna ut_line e aspetta che venga stabilita una connessione. login(1), dopo aver autenticato un utente, cambia ut_type perché valga USER_PROCESS, aggiorna ut_time e imposta ut_host e ut_addr. In base al comportamento di mingetty(8) (o agetty(8)) e login(1), i record possono essere indirizzati da ut_line invece del metodo preferibile, ut_pid.

Quando init(1) scopre che un processo è terminato, ricerca la sua voce utmp tramite ut_pid, assegna il valore DEAD_PROCESS a ut_type e pulisce ut_user, ut_host e ut_time, assegnandogli dei byte nulli.

xterm(1) e altri emulatori terminale creano direttamente un record USER_PROCESS e generano il ut_id usando la stringa che compone il suffisso finale del nome del terminale (i caratteri che seguono /dev/[pt]ty). Se trovano un DEAD_PROCESS per questo ID lo riciclano, altrimenti creano una nuova voce. Se possono, lo marcheranno come DEAD_PROCESS all'uscita e si consiglia che azzerino anche ut_line, ut_time, ut_user e ut_host.

telnetd(8) imposta una voce LOGIN_PROCESS e lascia il resto a login(1) come al solito. Dopo che la sessione telnet termina telnetd(8) pulisce utmp nel modo descritto.

Il file wtmp registra tutti i login e logout. Il suo formato è esattamente come utmp tranne che un nome utente nullo indica un logout sul terminale associato. Inoltre il nome terminale ~ con nome utente shutdown o reboot indica uno spegnimento o riavvio del sistema e la coppia di nomi di terminale |/} registra la vecchia/nuova ora di sistema quando date(1) la cambia. wtmp è mantenuto da login(1), init(1), e da alcune versioni di getty(8) (cioè mingetty(8) o agetty(8)). Il file non è creato da nessuno di questi programmi, quindi se esso viene rimosso la registrazione è disattivata.

FILE
/var/run/utmp
/var/log/wtmp

VERSIONI
POSIX.1 non specifica una struttura utmp ma una che si chiama utmpx (all'interno delle estensioni XSI), con indicazioni per i campi ut_type, ut_pid, ut_line, ut_id, ut_user e ut_tv. POSIX.1 non specifica la lunghezza dei campi ut_line e ut_user.

Linux definisce la struttura utmpx uguale a quella di utmp.

CONFORME A
Linux.

STORIA
Le voci Linux utmp non sono conformi nè a v7/BSD nè a SYSV; esse sono un mix delle due.

v7/BSD ha meno campi; più importante, esso non ha ut_type, e ciò fa sì che programmi nativi v7/BSD visualizzino (per esempio) voci morte o di login. Inoltre, non c'è alcun file di configurazione che alloca spazi alle sessioni. BSD fa questo perché non ha campi ut_id.

In Linux (come in System V), il campo ut_id di un record non cambierà mai una volta che è stato impostato, e ciò riserva questo spazio senza bisogno di un file di configurazione. Cancellare ut_id può dar luogo a delle race condition che portano a voci utmp corrotte e a potenziali buchi di sicurezza. Cancellare i campi menzionati sopra riempiendoli con byte nulli non è richiesto dalla semantica System V, ma permette di eseguire molti programmi che assumono la semantica BSD e che non modificano utmp. Linux usa le convenzioni BSD per i contenuti di linea, come documentato in precedenza.

System V non ha campi ut_host o ut_addr_v6.

NOTE
A differenza di vari altri sistemi, in cui la registrazione in utmp può essere disabilitata cancellando il file, utmp deve sempre esistere in Linux. Se si vuole disabilitare who(1) basta togliere il permesso di lettura globale al file utmp.

Il formato del file dipende dalla macchina, perciò si raccomanda di elaborarlo solo su macchine con la stessa architettura di quella su cui il file è stato creato.

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);

si raccomanda il seguente metodo per impostare il campo:

    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;

VEDERE ANCHE
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)

TRADUZIONE
La traduzione italiana di questa pagina di manuale è stata creata da Giovanni Bortolozzo <borto@dei.unipd.it>, Alessandro Rubini <rubini@linux.it>, Ottavio G. Rizzo <rizzo@pluto.linux.it>, Giulio Daprelà <giulio@pluto.it>, Elisabetta Galli <lab@kkk.it>, Marco Curreli <marcocurreli@tiscali.it> e Giuseppe Sacco <eppesuig@debian.org>

Questa traduzione è documentazione libera; leggere la GNU General Public License Versione 3 (https://www.gnu.org/licenses/gpl-3.0.html) o successiva per le condizioni di copyright. Non ci assumiamo alcuna responsabilità.

Per segnalare errori nella traduzione di questa pagina di manuale inviare un messaggio a pluto-ildp@lists.pluto.it.