Provided by:
manpages-es_1.55-10_all 
NOMBRE
utmp, wtmp - registro de sesiones
SINOPSIS
#include <utmp.h>
DESCRIPCI'ON
El fichero utmp nos permite obtener informacion de quienes estan usando
el sistema actualmente. Puede haber mas usuarios usando el sistema en
el momento actual ya que no todos los programas usan utmp como registro
de sesiones.
Atenci'on: utmp no debe ser modificable ya que muchos programas del
sistema dependen (tontamente) de su integridad. Corre el riesgo de
tener ficheros de registro (logfiles) del sistema falsos y de
modificaciones en ficheros del sistema si deja que cualquiera pueda
escribir en utmp.
El fichero es una secuencia de entradas con la siguiente estructura
declarada en el fichero cabecera (dese cuenta que esta es solo una de
las posibles definiciones; los detalles dependen de la version de
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; /* estado de terminacion del
proceso. */
short int e_exit; /* estado de salida del
proceso. */
};
struct utmp {
short ut_type; /* tipo de login */
pid_t ut_pid; /* pid del proceso de login */
char ut_line[UT_LINESIZE]; /* nombre de dispositivo de tty */
char ut_id[2]; /* id de inicio o nombre abreviado
de tty */
char ut_user[UT_NAMESIZE]; /* nombre de usuario */
char ut_host[UT_HOSTSIZE]; /* nombre de la maquina para login
remoto */
struct exit_status ut_exit; /* estado de salida de un proceso
marcado como DEAD_PROCESS. */
long ut_session; /* ID de sesion, usado para el
manejo de ventanas */
struct timeval ut_tv; /* instante en el que se hizo la
entrada. */
int32_t ut_addr_v6[4]; /* direccion IP de la maquina
remota. */
char pad[20]; /* Reservado para uso futuro. */
};
/* Para compatibilidad hacia atras. */
#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]
Esta estructura nos da el nombre del fichero especial asociado con el
terminal del usuario, el login del usuario y el momento de inicio de
sesion en el formato de time(2). Los campos del tipo cadena terminan
en '\0' si son mas cortos que el tamano del campo.
Las primeras entradas que se crean siempre proceden del procesamiento
de inittab(5) por parte de init(8). Sin embargo, antes de que se
procese una entrada, init(8) limpia utmp asignando a ut_type el valor
DEAD_PROCESS, limpiando los campos ut_user, ut_host y ut_time con
caracteres nulos para cada registro cuyo campo ut_type no sea
DEAD_PROCESS ni RUN_LVL y donde no exista ningun proceso con PID
ut_pid. Si no se puede encontrar ningun registro vacio con el ut_id que
se necesita, init crea uno nuevo. Asigna un valor a ut_id a partir del
inittab, a ut_pid y a ut_time a partir de los valores actuales y asigna
a ut_type el valor INIT_PROCESS.
getty(8) busca la entrada por el pid, cambia el valor de ut_type a
LOGIN_PROCESS, cambia ut_time, asigna un valor a ut_line y espera a que
se establezca la conexion. login(8), despues de que se haya
autenticado un usuario, cambia el valor de ut_type a USER_PROCESS,
cambia ut_time y asigna un valor a ut_host y a ut_addr. Dependiendo de
getty(8) y login(8), los registros se pueden buscar por ut_line en
lugar de por ut_pid, como es preferible.
Cuando init(8) encuentra que un proceso ha terminado, busca su entrada
utmp por ut_pid, asinga a ut_type el valor DEAD_PROCESS y limpia
ut_user, ut_host y ut_time con bytes nulos.
xterm(1) y otros emuladores de terminal crean directamente un registro
USER_PROCESS y generan ut_id utilizando las ultimas dos letras de
/dev/ttyp%c o utilizando p%d para /dev/pts/%d. Si encuentran un
DEAD_PROCESS para este id, lo reutilizan, en caso contrario, crean una
nueva entrada. Si pueden, las marcaran como DEAD_PROCESS al terminar y
se aconseja que tambien rellenen con nulos los campos ut_line, ut_time,
ut_user y ut_host.
xdm(8) no debe crear un registro utmp, ya que no hay un terminal
asignado. Si se le perimte crear uno provocara errores como wtmp, tal
como lo hace ftpd(8).
telnetd(8) establece una entrada LOGIN_PROCESS y deja el resto a
login(8), como es habitual. Despues de que termine la sesion de
telnet, telnetd(8) limpia utmp de la forma descrita.
El ficherowtmp registra todos los inicios y finales de sesion. Su
formato es como el de utmp salvo ue un nombre nulo de usuario indica el
fin de sesion en la terminal asociada. Ademas, el nombre de terminal
"~" con nombre de usuario "shutdown" r "reboot" indica un cierre
(shutdown) o rearranque del sistema y el par de nombres de terminal
"|"/"}" registra la fecha antigua/nueva del sistema cuando la cambia
date(1). wtmp es mantenido por login(1), e init(1) y algunas versiones
de getty(1). Ninguno de estos programas crea el fichero, por lo que si
se borra se desactiva el mantenimiento de los registros.
FICHEROS
/var/run/utmp
/var/log/wtmp
CONFORME A
Las entradas utmp de Linux no se corresponden ni con las de v7/BSD ni
con las de SYSV; son una mezcla de ambos tipos. v7/BSD tiene menos
campos; lo mas importante es la falta de ut_type, lo que provocara que
los programas nativos de v7/BSD muestren (por ejemplo) entradas
truncadas o de sesion. Ademas, no existe ningun fichero de
configuracion que asigne entradas a las sesiones. BSD lo hace de esta
manera por la ausencia de los campos ut_id. En Linux (como en SYSV), el
campo ut_id de un registro nunca cambiara una vez que se le haya
asignado un valor, lo que reserva esa entrada sin necesidad de un
fichero de configuracion. Limpiar el campo ut_id puede producir
condiciones de carrera que conduzcan a entradas utmp corruptas y a
agujeros de seguridad potenciales. La semantica de SYSV no necesita la
limpieza de los campos mencionados anteriormente rellenandolos con
bytes nulos, pero esto permite ejecutar muchos programas que suponen
una semantica BSD y que no modifican utmp. Linux usa las convenciones
de BSD para los contenidos de las lineas, tal y como se ha documentado
mas arriba.
SYSV solo usa el campo de tipo para marcarlas y para grabar en el campo
de linea mensajes informativos tales como, por ejemplo, "new time".
UT_UNKNOWN parece ser un invento de Linux. SYSV no tiene los campos
ut_host ni ut_addr.
A diferencia de otros sistemas, donde el registro de informacion en
utmp se puede desabilitar borrando el fichero, en Linux este fichero
siempre debe existir. Si quiere deshabilitar who(1) elimine el permiso
de lectura de utmp de los permisos correspondientes a "otros".
Note que la estructura utmp de libc5 ha cambiado en libc6. Como
consecuencia de esto, los binarios que usen la antigua estructura de
libc5 corromperan /var/run/utmp y/o /var/log/wtmp. Los sistemas Debian
incluyen una libc5 parcheada que usa el nuevo formato de utmp. El
problema todavia existe con wtmp ya que se utiliza directamente en
libc5.
FALLOS
Esta pagina de manual se basa en la de libc5; ahora las cosas pueden
funcionar de forma diferente.
RESTRICCIONES
El formato del fichero es dependiente de la maquina, por lo que se
recomienda que sea procesado unicamente en la arquitectura de maquina
donde se creo.
V'EASE TAMBI'EN
ac(1), date(1), getutent(3), init(8), last(1), login(1), updwtmp(3),
who(1)