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 fichero
wtmp 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
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)