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, poiché molti
  programmi di sistema dipendono (stupidamente) dalla sua integrità. Si
  rischia di avere file di log contraffatti e file del sistema modificati
  lasciando 
utmp scrivibile da qualsiasi utente.
Il file è una sequenza di voci con la seguente struttura dichiarata nel
  file di include (si noti che questa è solo una delle numerose definizioni
  in giro; i dettagli dipendono dalla versione di libc):
 
#define UT_UNKNOWN      0
#define RUN_LVL         1
#define BOOT_TIME       2
#define NEW_TIME        3
#define OLD_TIME        4
#define INIT_PROCESS    5
#define LOGIN_PROCESS   6
#define USER_PROCESS    7
#define DEAD_PROCESS    8
#define ACCOUNTING      9
#define UT_LINESIZE     12
#define UT_NAMESIZE     32
#define UT_HOSTSIZE     256
struct exit_status {
  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 login */
  pid_t ut_pid;               /* PID del processo di login */
  char ut_line[UT_LINESIZE];  /* nome del dispositivo tty - "/dev/" */
  char ut_id[4];              /* identificativo di init o nome tty abbrev. */
  char ut_user[UT_NAMESIZE];  /* nome utente */
  char ut_host[UT_HOSTSIZE];  /* nome dell'host per il login remoto */
  struct exit_status ut_exit; /* Lo stato di uscita di un processo
                                 marcato come DEAD_PROCESS */
  
  /* 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, usato per il windowing */
  struct {
    int32_t tv_sec;           /* Secondi */
    int32_t tv_usec;          /* Microsecondi */
  } ut_tv;                    /* Creata una voce Time */
#else
   long int ut_session;        /* ID della sessione, usato per il windowing */
   struct timeval ut_tv;       /* Creata una voce Time */
#endif
  int32_t ut_addr_v6[4];       /* Indirizzo IP dell'host remoto */
  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 con il terminale
  utente, il nome di login dell'utente, e l'ora di login nel formato di
  
time(2). I campi stringa sono terminati con 
'\0' se sono
  più corti della dimensione del campo.
Le prime voci del file sono il risultato di 
init(8) quando processa
  
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 ne crea una nuova. Poi assegna 
ut_id dal
  file inittab, assegna i valori attuali a 
ut_pid e fIut_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), le registrazioni
  possono essere indirizzate 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 le ultime due lettere di
  
/dev/ttyp%c o usando 
p%d per
  
/dev/pts/%d. Se essi 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 
|/
} fa il log della 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.
Notare che su piattaforme 
biarch, come sistemi che possono far girare sia
  applicazioni 32-bit che 64-bit (x86-64, ppc64, s390x, etc.), 
ut_tv
  è della stessa dimensione in modo 32-bit e in modo 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. Poiché 
ut_tv potrebbe non essere lo stesso di
  
struct timeval, allora, 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;
FILE¶
/var/run/utmp
 
/var/log/wtmp
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 slot 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 usa solo il campo type per marcare le righe e registra messaggi
  informativi come, per esempio, 
"new time" nel campo line.
  
UT_UNKNOWN sembra essere una invenzione di Linux. System V non ha campi
  
ut_host o 
ut_addr_v6.
A differenza di vari altri sistemi, dove 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.
Si noti che lo struct di 
utmp è cambiato tra libc5 e libc6. Di
  conseguenza, un programma che usi il vecchio struct di libc5 altera
  
/var/run/utmp e/o 
/var/log/wtmp.
NOTE¶
Il formato del file dipende dalla macchina, perciò si raccomanda di
  modificarlo solo macchine della stessa architettura di quella su cui il file
  è stato creato.
Si noti che su piattaforme che possono eseguire applicazioni sia a 32-bit che a
  64-bit (x86-64, ppc64, s390x, etc.), le dimensioni dei campi di una struttura
  
utmp devono essere le stesse in modalità 32-bit e in modalità
  64-bit. Ciò è raggiunto cambiando il tipo di 
ut_session in
  
int32_t, e quello di 
ut_tv in una struttura con due campi
  
int32_t tv_sec e 
tv_usec. (Quindi, per riempirlo, mettere
  l'ora in una reale 
struct timeval, quindi copiare i due campi in
  
ut_tv.)
BACHI¶
Questa pagina di manuale si basa su quella di libc5, ora le cose potrebbero
  funzionare diversamente.
VEDERE ANCHE¶
ac(1), 
date(1), 
last(1), 
login(1), 
who(1),
  
getutent(3), 
updwtmp(3), 
init(8)
COLOPHON¶
Questa pagina fa parte del rilascio 2.80 del progetto 
man-pages di Linux.
  Si può trovare una descrizione del progetto, e informazioni su come
  riportare bachi, presso 
http://www.kernel.org/doc/man-pages/. Per la
  traduzione in italiano si può fare riferimento a
  
http://www.pluto.it/ildp/collaborare/