Provided by: manpages-it_3.73-2_all bug

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 /* 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(8)) */
           #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(8) */
           #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 int e_termination;      /* stato di chiusura del processo */
               short int 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(8) 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]

       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(8) quando elabora inittab(5).  Prima  che
       una  voce  sia  eseguita,  però,  init(8)  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(8) 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(8)  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(8),  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

CONFORME A

       POSIX.1 non specifica una struttura utmp ma una che si chiama utmpx, con specifiche 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.

   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), last(1), login(1), utmpdump(1), who(1), getutent(3), getutmp(3), login(3),
       logout(3), logwtmp(3), updwtmp(3), init(8)

COLOPHON

       Questa  pagina  fa  parte del rilascio 3.73 del progetto Linux man-pages.  Una descrizione
       del progetto, le istruzioni per la segnalazione  degli  errori,  e  l'ultima  versione  di
       questa pagina si trova su http://www.kernel.org/doc/man-pages/.

       La versione italiana fa parte del pacchetto man-pages-it v. 3.73, a cura di: ILDP "Italian
       Linux Documentation Project" http://www.pluto.it/ildp
       Per    la     traduzione     in     italiano     si     può     fare     riferimento     a
       http://www.pluto.it/ildp/collaborare/
       Segnalare eventuali errori di traduzione a ildp@pluto.it