UTMP(5)

NOMBRE
utmp, wtmp - registro de sesiones

SINOPSIS
#include <utmp.h>

DESCRIPCION
El fichero utmp nos permite obtener información de quiénes están usando el sistema actualmente. Puede haber más usuarios usando el sistema en el momento actual ya que no todos los programas usan utmp como registro de sesiones.

Atención: utmp no debe ser modificable ya que muchos programas del sistema dependen de su integridad. programs depend on its integrity. You risk faked system logfiles and modifications of system files if you leave utmp writable to any user.

El fichero es una secuencia de entradas con la siguiente estructura declarada en el fichero cabecera:

    #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 UT_LINESIZE	12
    #define UT_NAMESIZE	8
    #define UT_HOSTSIZE	16
    struct utmp {
      short ut_type;	/* tipo de login */
      pid_t ut_pid;		/* pid del proceso */
      char ut_line[UT_LINESIZE];	/* nombre de dispositivo de tty */
      char ut_id[2];	/* id de inicio o nombre abreviado de tty */
      time_t ut_time;	/* Inicio del login */
      char ut_user[UT_NAMESIZE];	/* nombre de usuario */
      char ut_host[UT_HOSTSIZE];	/* nombre de la máquina para login remoto */
      long ut_addr;	/* dirección IP de la máquina remota */
    };

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 sesión en el formato de time(2). Los campos del tipo cadena terminan en '\0' si son más cortos que el tamaño 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 ningún proceso con PID ut_pid. Si no se puede encontrar ningún registro vacío 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 conexión. login(8), después 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 últimas 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 marcarán como DEAD_PROCESS al terminar y se aconseja que también 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 provocará problemas del tipo: finger: can not stat /dev/machine.dom. En cambio, debe crear entradas wtmp, tal como lo hace ftpd(8).

telnetd(8) establece una entrada LOGIN_PROCESS y deja el resto a login(8), como es habitual. Después de que termine la sesión de telnet, telnetd(8) limpia utmp de la forma descrita.

El ficherowtmp registra todos los inicios y finales de sesión. Su formato es como el de utmp salvo ue un nombre nulo de usuario indica el fin de sesión en la terminal asociada. Además, 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 CON
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 más importante es la falta de ut_type, lo que provocará que los programas nativos de v7/BSD muestren (por ejemplo) entradas truncadas o de sesión. Además, no existe ningún fichero de configuración 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 cambiará una vez que se le haya asignado un valor, lo que reserva esa entrada sin necesidad de un fichero de configuración. Limpiar el campo ut_id puede producir condiciones de carrera que conduzcan a entradas utmp corruptas y a agujeros de seguridad potenciales. La semántica de SYSV no necesita la limpieza de los campos mencionados anteriormente rellenándolos con bytes nulos, pero esto permite ejecutar muchos programas que suponen una semántica BSD y que no modifican utmp. Linux usa las convenciones de BSD para los contenidos de las líneas, tal y como se ha documentado más arriba. SYSV sólo usa el campo de tipo para marcarlas y para grabar en el campo de línea mensajes informativos tales como, por ejemplo, "new time". SYSV tiene un campo más para guardar el estado de salida de los procesos muertos. UT_UNKNOWN parece ser una invento de Linux. No existe en Linux el tipo ACCOUNTING. SYSV no tiene los campos ut_host ni ut_addr. A diferencia de otros sistemas, donde el registro de información 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".

RESTRICCIONES
El formato del fichero es dependiente de la máquina, por lo que se recomienda que sea procesado únicamente en la arquitectura de máquina donde se creó.

VER TAMBIÉN
ac(1), date(1), last(1), login(1), who(1), getutent(3), init(8)