Es muy útil poder grabar las sesiones de terminal en Linux ya sea para nuestras propias sesiones, o por seguridad si somos los administradores del sistema.
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.
- Ayuda del comando script
- Cómo usar el comando script para grabar las sesiones de terminal en Linux
- Grabar la sesión de terminal junto con la info de sincronización (opciones timing y log)
- Reproducir con el comando scriptreplay una sesión de terminal grabada en Linux
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 |
Cómo usar el comando script para grabar las sesiones de terminal en Linux
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:
Grabar la sesión de terminal en Linux junto con la info de sincronización (opciones timing y log)
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:
- El parámetro timing guarda los tiempos entre los comandos y la salida de los comandos. Aquí lo explica la ayuda del comando script:
- El nombre del fichero de log donde se guardarán los comandos ejecutados
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:
Reproducir una sesión de terminal grabada en Linux con el comando scriptreplay
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 |
Cómo grabar las sesiones de terminal para todos los usuarios del sistema en Linux
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:
Los ficheros timing y log
Contenido del fichero timing
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.
Contenido del fichero log
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.