Provided by: manpages-es_1.55-10_all bug

NOMBRE

       utmp, wtmp - registro de sesiones

SINOPSIS

       #include <utmp.h>

DESCRIPCIÓN

       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
       (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  ésta  es sólo una de las posibles definiciones; los
       detalles dependen de la versión 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 terminación 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 máquina para login
                                               remoto */
                struct exit_status ut_exit; /* estado de salida de un proceso
                                               marcado como DEAD_PROCESS. */
                long ut_session;            /* ID de sesión, usado para el
                                               manejo de ventanas */
                struct timeval ut_tv;       /* instante en el que se hizo la
                                               entrada. */
                int32_t ut_addr_v6[4];      /* dirección IP de la máquina
                                               remota. */
                char pad[20];               /* Reservado para uso futuro.  */
              };

              /* Para compatibilidad hacia atrás.  */
              #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 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á 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.  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 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 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". 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  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".

       Note que la estructura utmp de libc5 ha cambiado en libc6. Como consecuencia de esto,  los
       binarios   que   usen  la  antigua  estructura  de  libc5  corromperán  /var/run/utmp  y/o
       /var/log/wtmp.  Los sistemas Debian incluyen una libc5 parcheada que usa el nuevo  formato
       de utmp. El problema todavía existe con wtmp ya que se utiliza directamente en libc5.

FALLOS

       Esta  página  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 máquina, por lo  que  se  recomienda  que  sea
       procesado únicamente en la arquitectura de máquina donde se creó.

VÉASE TAMBIÉN

       ac(1), date(1), getutent(3), init(8), last(1), login(1), updwtmp(3), who(1)