Si estás buscando grabar todas las sesiones de terminal de los usuarios en Linux, ve a esta sección del artículo.
Para grabar sesiones de terminal en Linux usaremos los comandos script y para reproducir las sesiones el comando scriptreplay.
La diferencia del comando script respecto al comando history, es que history guarda el historial de los comandos, pero no muestra la salida de los comandos.
Con los comandos script y typescript, podemos llevar un registro completo de los comandos ejecutados y de la salida de los comandos, viendo la grabación de toda la sesión.
La ayuda del comando script muestra:
El comando script es parte del paquete bsdutils en sistemas basados en Debian, y del paquete util-linux-ng en sistemas basados en Red Hat.
Lo primero comprobamos si el paquete se encuentra encuentra instalado en el sistema; dependiendo de si está basado en CentOS o en Debian, lo comprobamos de estas formas:
–> Debian/Ubuntu:
test@Ubuntu:~$ dpkg -S /usr/bin/script
bsdutils: /usr/bin/script
–> CentOS/RedHat
# rpm -qf /usr/bin/script
util-linux-2.32.1-8.el8.x86_64
# rpm -qf /usr/bin/scriptreplay
util-linux-2.32.1-8.el8.x86_64
Primero, para comenzar a grabar nuestra sesión, tecleamos el comando:
script
y comenzará a capturar nuestra sesión en un fichero con nombre: typescript
test@Ubuntu:~$ script
Script iniciado; el fichero es typescript
test@Ubuntu:~$ id
uid=1001(test) gid=1001(test) grupos=1001(test),27(sudo)
test@Ubuntu:~$ pwd
/home/test
Cuando queramos dejar de grabar la sesión, tecleamos:
exit
test@Ubuntu:~$ exit
exit
Script terminado; el fichero es typescript
En esta sesión hemos ejecutado estos comandos:
date
ls
id
pwd
who
w
Después hemos parado la grabación de la sesión con:
exit
Ahora comprobamos el contenido del fichero typescript:
cat typescript
Podemos ver cómo se muestran todos los comandos ejecutados, y su salida por pantalla:
Y si investigamos el fichero con el editor vi, podemos ver:
Si grabamos la sesión y la info de sincronización, podremos reproducir la sesión a tiempo real, con los mismos tiempos que cuando ejecutamos la sesión.
Para poder hacer esto, hemos de utilizar 2 parámetros:
timing y log
Cada uno de estos parámetros usará un fichero:
puede ser el nombre que queramos con extensión .log
Ahora lanzamos una sesión que grabe la sesión con estos dos parámetros, timing y log:
Así:
script --timing=timing.txt session.log
Y en el ejemplo en nuestra máquina:
test@Ubuntu:~$ script --timing=sincronizacion.txt sesion.log
Cuando haya terminado la sesión :
exit
Script terminado; el fichero es sesion.log
Así se ve la grabación de una sesión en Linux con el comando script tal como hemos explicado:
Y podremos reproducir la sesión con el comando scriptreplay, usando igualmente las opciones timing y log y los dos ficheros anteriores.
Estos dos ficheros se combinan y conseguimos reproducir así la sesión con el comando scriptreplay
scriptreplay --timing=sincronizacion.txt sesion.log
Otra opción muy pero que muy interesante, sobre todo para administradores de sistemas Linux, es la de poder grabar las sesiones de terminal de todos lo usuarios del sistema.
Lo podemos conseguir añadiendo el siguiente código:
if [ "x$SESSION_RECORD" = "x" ]
then
timestamp=$(date +%d-%m-%Y-%T)
session_log=/var/log/session/session.$USER.$$.$timestamp
SESSION_RECORD=started
export SESSION_RECORD
script -t -f -q 2>${session_log}.timing $session_log
exit
fi
Dependiendo de la distro que usemos, podemos añadirlo para que se cargue de forma global, en uno de estos ficheros:
/etc/profile
o
~/.profile
o
~/.bashrc
Vemos cómo lo hemos añadido en este caso en un Ubuntu, en el fichero ~.bashrc:
Y al acceder al directorio que hemos configurado para guardar las sesiones, podemos ver que los archivos de sincronización se crean automáticamente cuando el usuario comienza su sesión en la terminal:
Vemos el contenido del fichero timing, que en nuestro caso hemos llamado sincronizacion.txt:
Como decíamos antes, este fichero guarda los tiempos entre los comandos y la salida de los comandos. Cada fila de datos contiene dos campos.
El primer campo muestra cuanto tiempo ha pasado desde la anterior salida de datos por pantalla.
El segundo campo muestra cuantos caracteres se han mostrado por pantalla esta vez.
Vemos que el fichero de log usado con el comando script para grabar sesiones junto con la info de sincronización, muestra todos los comandos ejecutados y su salida por pantalla.