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

    /* Valori per il campo ut_type, sotto */

    #define EMPTY         0 /* Il record non contiene informazioni valide
                               (precedentemente conosciuto come UT_UNKNOWN su Linux) */
    #define RUN_LVL       1 /* Cambiamento nel run-level di sistema (vedere
                               init(1)) */
    #define BOOT_TIME     2 /* Tempo di avvio del sistema (in ut_tv) */
    #define NEW_TIME      3 /* Tempo dopo il cambiamento dell'orologio di sistema
                               (in ut_tv) */
    #define OLD_TIME      4 /* Tempo prima del cambiamento dell'orologio di sistema
                               (in ut_tv) */
    #define INIT_PROCESS  5 /* Processo rigenerato da init(1) */
    #define LOGIN_PROCESS 6 /* Processo leader della sessione per il login
                               dell'utente */
    #define USER_PROCESS  7 /* Processo normale */
    #define DEAD_PROCESS  8 /* Processo terminato */
    #define ACCOUNTING    9 /* Non implementato */

    #define UT_LINESIZE      32
    #define UT_NAMESIZE      32
    #define UT_HOSTSIZE     256

    struct exit_status {              /* Tipo per ut_exit, sotto */
        short e_termination;      /* stato di chiusura del processo */
        short e_exit;             /* stato di uscita del processo */
    };

    struct utmp {
        short   ut_type;              /* tipo di record */
        pid_t   ut_pid;               /* PID del processo di login */
        char    ut_line[UT_LINESIZE]; /* nome del dispositivo tty - "/dev/" */
        char    ut_id[4];             /* suffisso del nome del terminale,
                                         o ID inittab(5) */
        char    ut_user[UT_NAMESIZE]; /* nome utente */
        char    ut_host[UT_HOSTSIZE]; /* nome dell'host per il login remoto, o
                                         versione del kernel per i messaggi di
                                         run-level*/
        struct  exit_status ut_exit;  /* stato di uscita di un processo
                                         marcato come DEAD_PROCESS; non usato
                                         dal programma init(1) di Linux */
        /* I campi ut_session e ut_tv devono essere della stessa dimensione sia
           compilati per 32 che per 64 bit.  Ciò permette a file dati e memoria
           condivisa di essere condivisi tra applicazioni 32-bit e applicazioni
           64-bit. */
    #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
        int32_t ut_session;           /* ID della sessione (getsid(2)),
                                         usato per il windowing */
        struct {
            int32_t tv_sec;           /* secondi */
            int32_t tv_usec;          /* microsecondi */
        } ut_tv;                      /* creata una voce Time */
    #else
         long   ut_session;           /* ID della sessione */
         struct timeval ut_tv;        /* creata una voce Time */
    #endif

        int32_t ut_addr_v6[4];        /* indirizzo IP dell'host
                                         remoto; gli indirizzi IPv4 usano
                                         solo ut_addr_v6[0] */
        char __unused[20];            /* riservato per usi futuri */
    };

    /* Trucchi per la compatibilità all'indietro */
    #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]

This structure gives the name of the special file associated with the user's terminal, the user's login name, and the time of login in the form of time(2). String fields are terminated by a null byte ('\0') if they are shorter than the size of the field.

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.

The wtmp file records all logins and logouts. Its format is exactly like utmp except that a null username indicates a logout on the associated terminal. Furthermore, the terminal name ~ with username shutdown or reboot indicates a system shutdown or reboot and the pair of terminal names |/} logs the old/new system time when date(1) changes it. wtmp is maintained by login(1), init(1), and some versions of getty(8) (e.g., mingetty(8) or agetty(8)). None of these programs creates the file, so if it is removed, record-keeping is turned off.

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

STANDARDS
POSIX.1 does not specify a utmp structure, but rather one named utmpx (as part of the XSI extension), with specifications for the fields ut_type, ut_pid, ut_line, ut_id, ut_user, and ut_tv. POSIX.1 does not specify the lengths of the ut_line and ut_user fields.

Linux definisce la struttura utmpx uguale a quella di utmp.

  Confronto tra sistemi storici
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.

Notare che su piattaforme biarch, cioé sistemi che possono far girare sia applicazioni 32-bit che 64-bit (x86-64, ppc64, s390x, etc.), ut_tv è della stessa dimensione in modalità 32-bit e in modalità 64-bit. Lo stesso vale per ut_session e ut_time se sono presenti. Ciò permette a file dati e memoria condivisa di essere condivisi tra applicazioni 32-bit e applicazioni 64-bit. Ciò si ottiene cambiando il tipo di ut_session a int32_t, e il tipo di ut_tv ad una struttura con due campi int32_t, tv_sec e tv_usec. Poiché ut_tv potrebbe non essere lo stesso di struct timeval, invece della chiamata:

    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> e Marco Curreli <marcocurreli@tiscali.it>

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.