|
UTMP(5) manual page
Table of Contents
utmp, wtmp - registri dei login
#include <utmp.h>
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, in quanto molti programmi
di sistema dipendono (stupidamente) dalla sua integrità. Si rischia che
vengano contraffatti i file di log del sistema e che il sistema sia modificato
se si lascia utmp scrivibile a 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;
/* process termination status. */
short int e_exit; /* process
exit status. */
};
struct utmp {
short ut_type; /* type of
login */
pid_t ut_pid; /* pid of login process */
char ut_line[UT_LINESIZE];
/* device name of tty - "/dev/" */
char ut_id[4]; /* init
id or abbrev. ttyname */
char ut_user[UT_NAMESIZE]; /* user name
*/
char ut_host[UT_HOSTSIZE]; /* hostname for remote login */
struct exit_status ut_exit; /* The exit status of a process
marked as DEAD_PROCESS. */
long ut_session; /* session ID, used
for windowing*/
struct timeval ut_tv; /* time entry was made.
*/
int32_t ut_addr_v6[4]; /* IP address of remote host. */
char pad[20]; /* Reserved for future use. */
};
/* Per compatibilità
con le versioni precedenti */
#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 da 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 esegue inittab (5)
. Prima che una voce
sia eseguita, però, init (8)
pulisce il file utmp assegnando il valore
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 vuoti con la ut_id necessaria, init ne crea una nuova. Poi
assegna ut_id dal file inittab, assegna i valori correnti a ut_pid e
ut_time e assegna INIT_PROCESS a ut_type .
Il processo getty (8)
ricerca
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. Il processo login (8)
modifica il file dopo aver autenticato
un utente: cambia ut_type perché valga USER_PROCESS , aggiorna ut_time
e assegna valori a ut_host e ut_addr . In base al comportamento di getty
(8)
e login (8)
, le registrazioni possono essere indirizzate da ut_line
invece del metodo preferibile, ut_pid .
Quando init (8)
scopre che un
processo ha 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 di terminale
creano direttamente una registrazione USER_PROCESS e generano il campo
ut_id usando le ultime due lettere di /dev/ttyp %c , oppure usando p
%d per periferiche /dev/pts/ %d . Se trovano una registrazione DEAD_PROCESS
per l'identificativo scelto la riciclano, altrimenti creano una nuova
registrazione. Se possono , questi programmi marcano la voce come DEAD_PROCESS
quando terminano, è consigliabile anche che azzerino ut_line , ut_time
, ut_user e ut_host .
xdm (8)
non dovrebbe creare registrazioni utmp,
perché non ci sono terminali assegnati al programma. Permettergli di creare
una registrazione risulterebbe in alcuno problemi, come: ``finger: can not
stat /dev/machine.dom''. Il programma, però, dovrebbe creare voci wtmp, proprio
come fa ftpd (8)
.
Il programma telnetd (8)
predispone una voce LOGIN_PROCESS
e lascia il resto del lavoro a login (8)
come al solito. Dopo la fine
della sessione telnet, telnetd (8)
pulisce utmp nel modo descritto.
Il
file wtmp registra tutti i login e i logout. Il suo formato è esattamente
come quello di utmp con l'eccezione che un nome utente nullo indica il
logout nel terminale associato. Inoltre, il nome del terminale "~" con
nome utente "shutdown" o "reboot" indica uno shutdown o reboot e la
coppia di nomi di terminale "|" /"}" registra la vecchia/nuova ora del
sistema quando il comando date(1)
la cambia. wtmp è mantenuto da login
(1)
, init (1)
e alcuni tipi di getty (1)
. Nessuno di questi programmi crea
il file, perciò se viene la registrazione rimane disabilitata.
/var/adm/utmp
/var/adm/wtmp
Le voci utmp di Linux non sono conformi né
a v7/BSD né a SYSV: sono un misto delle due. v7/BSD ha meno campi, ed è
importante il fatto che manchi del campo ut_type , cosa che fa si che
i programmi nativi tipo v7/BSD mostrino le voci relative a sessioni terminate.
Inoltre non esiste un file di configurazione che allochi le voci per
le sessioni. BSD si comporta in questo modo perché gli manca il campo ut_id
. In Linux (come in SYSV), il campo ut_id di una registrazione non cambierà
mai una volta creato, il che riserva la voce senza bisogno di un file
di configurazione. La cancellazione di ut_id può risultare in corse critiche
che portino a voci di utmp corrotte e, potenzialmente, a buchi di sicurezza.
La cancellazione dei campi menzionati riempiendoli di byte nulli non è
richiesta dalla semantica SYSV, ma permette di far girare molti programmi
che suppongono semantiche di tipo BSD e che non modificano utmp. Linux
usa le convenzioni BSD per il contenuto delle righe del file come documentato
sopra.
SYSV usa solo il campo ``type'' per marcare le righe e registra messaggi
informativi come "new time" nel campo ``line''. UT_UNKNOWN sembra essere
una invenzione di Linux. SYSV non ha i campi ut_host e ut_addr .
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
il comando who (1)
basta togliere il permesso di lettura 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.
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.
Questa pagina di manuale
si basa su quella di libc5, ora le cose potrebbero funzionare diversamente.
ac(1)
, date(1)
, getutent(3)
, init(8)
, last(1)
, login(1)
,
BR updwtmp (3)
, who(1)
Table of Contents
|