Provided by: manpages-es_1.55-8_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)