Cómo grabar los comandos introducidos en una terminal, y cómo reproducirlos posteriormente.

Enviado por siddharta el 23 Septiembre, 2009 - 00:45.

kterm.png

QUÉ HICE

He estado jugando con dos comandos para poder registrar otros comandos introducidos durante una sesión en la terminal, con la capacidad de reproducirlos más tarde. Es decir, así como se usan aplicaciones para capturar la pantalla con el propósito de crear videtutoriales, también es posible "capturar" los comandos en la terminal para mostrar más tarde cómo se hizo cierta activdad.

Dichos comandos son script y scriptreplay. Script inicia una sesión nueva en un subshell y crea 2 archivos: uno para registrar la duración de la introducción de comandos y otro para registrar dichos comandos así como el resultado de los mismos. Posteriormente se usa scriptreplay para reproducir la sesión, para lo cual toma la lista de comandos y la reproduce respetando la duración. Es una reproducción sólamente, es decir, si durante la "grabación" se creó un directorio entonces durante la reproducción no se creará ningún directorio, sólo se visualizará lo que sucedió.

CÓMO LO HICE

Explicaré partiendo de lo general hacia lo particular, sugiero leer el artículo completo antes de poner a prueba los comandos. Usaré un directorio temporal para los ejemplos:

$ mkdir ~/temporal/ ; cd ~/temporal/

1.- Para iniciar la grabación de la manera más simple se ejecuta el comando script así:

$ script
Script started, file is typescript

el mensaje mostrado indica que se ha creado el archivo typescript, en el cual se irán guardando los comandos que se vayan introduciendo. Si el archivo typescript no existe entonces se creará, y si ya existe entonces será sobreescrito. A partir de este momento todo lo que se escriba en la línea de comandos quedará registrado, y para finalizar "grabación" se escribe el comando exit:

$ exit
Script done, file is typescript

el mensaje anterior confirma que ha finalizado la "grabación". Para visualizar lo registrado se puede usar cat:

$ cat typescript

Aquí no se puede usar scriptreplay porque no se ha "grabado" la duración de los comandos.

2.- Si se desea usar un nombre de archivo distinto al predeterminado typescript entonces se usa el parámetro -a (append) y el nombre de archivo deseado. Si el archivo no existe entonces se creará, y si ya existe entonces no se borrará sino que se añadirá al final del mismo la nueva "grabación". Para facilitar la lectura y comprensión usaré la extensión .comandos :

$ script -a nombre.comandos
Script started, file is nombre.comandos

Aún no se puede usar scriptreplay porque no se ha "grabado" la duración de los comandos.


3.- Si se desea que script registre también la duración de los comandos para que después sean "reproducidos" con scriptreplay entonces se usa el parámetro -t (timing) y el nombre del archivo ...... ¡pero no lo ejecutes aún! ... sigue leyendo y sabrás por qué. Para facilitar la lectura y comprensión usaré la extensión .duracion :

$ script -t nombre.duracion -a nombre.comandos

¿por qué no ejecutarlo así? porque si se deja de esa manera entonces la terminal irá mostrando la duración e interferirá con los comandos escritos, así que para evitarlo se usa redireccionamiento, así:

$ script -t 2> nombre.duracion -a nombre.comandos

y una vez que ha finalizado la grabación con exit entonces se procede a usar scriptreplay especificando primeramente el archivo que tiene la duración y posteriormente el archivo que contiene los comandos, en ese orden siempre, así:

$ scriptreplay nombre.duracion nombre.comandos

tras lo cual se observará en la terminal cómo se "reproducen" los comandos que fueron "grabados", incluso con pausas que se hayan hecho, como las que se hacen si se titubea al escribir.


4.- Se puede personalizar un poco más el comando, agregando el nombre de usuario ($USER) y el nombre del equipo ($HOSTNAME) a los nombres de archivo, así:

$ script -t 2> $USER@$HOSTNAME.duracion -a $USER@$HOSTNAME.comandos

y esto hará que los nombres de archivo automáticamente lleven el nombre del usuario y el nombre del equipo, por ejemplo:

$ ls -l
total 8.0K
-rw-r--r-- 1 siddharta siddharta 749 2009-09-22 18:19 siddharta@casa.comandos
-rw-r--r-- 1 siddharta siddharta 340 2009-09-22 18:19 siddharta@casa.duracion

Algunas ideas:

Podría configurarse un script en el equipo para que de manera automática se inicie una "grabación" en el momento de iniciar sesión en la terminal, de esta manera se puede incrementar la seguridad del sistema al haber un registro. Esto puede ser para usuarios locales o para usuarios que inicien sesión remotamente, por ejemplo vía SSH.

La grabación también puede ser iniciada manualmente, por ejemplo para crear un tutorial, publicando o enviando posteriormente los 2 archivos junto con la instrucción para reproducirlos.

Algunas notas:

- Las contraseñas introducidas no se guardan, por ejemplo cuando se usa sudo, sino que sólo se registra lo que es visible en la terminal.

- El archivo que almacena la duración puede visualizarse con cualquier editor de texto, y consta sólo de 2 columnas que muestran el tiempo que ha transcurrido y cuántas teclas se pulsaron en ese tiempo.

- El archivo que almacena los comandos también puede visualizarse con un editor de texto, con el ¿inconveniente? de que el shell Bash (/bin/bash) habrá almacenado todas las pulsaciones especiales como CTRL+C, Escape, Backspace, TAB, etc., las cuales dificultarán la simple lectura de dicho archivo. Personalmente no siento que sea un incoveniente pues la idea principal es hacer que se reproduzca la "grabación" y no que se lea en un editor ..... a menos que se desee imprimir evitando todos esos caracteres especiales. Pero en caso de que alguien desee revisar manualmente el archivo de registro sin tener problemas de lectura o impresión entonces quizás le sea más factible usar el shell Bourne (/bin/sh) en vez del shell Bash para evitar los caracteres especiales, y usar un prompt sencillo, así:

$ SHELL=/bin/sh PS1="$ " script -t 2> nombre.duracion -a nombre.comandos

- Aunque algunos comentan que la "grabación" no funciona muy bien cuando se usan aplicaciones interactivas en las cuales es necesario pulsar combinaciones de teclas (por ejemplo emacs, nano, vim, top), la verdad es que yo, hasta este momento, no he tenido problema alguno con la grabación ni con la reproducción pues incluso he grabado la edición de archivos con nano y se visualizan correctamente.

En las páginas man (manual) hay más información al respecto:

$ man script
$ man scriptreplay

En los siguientes sitios (en inglés) hay más información útil:

http://www.builderau.com.au/program/linux/soa/Using-script-to-record-ter...
http://linux.byexamples.com/archives/279/record-the-terminal-session-and...
http://www.linuxinsight.com/replaying-terminal-sessions-with-scriptrepla...


Como dato curioso mencionaré que una técnica lejanamente similar es la que usó Tsutomu Shimomura para registrar las actividades de Kevin Mitnick cuando éste último se infiltraba en equipos ajenos. Pero Shimomura usó tcpdump y otro programa escrito por él mismo. Un ejemplo se muestra aquí:

$ telnet kevin-on-demand.takedown.com 4001

Después de ingresar, para iniciar la reproducción se debe presionar Enter, Y . Para cancelar se pulsa CTRL+] y luego se escribe quit, y se pulsa Enter.

y aquí hay mucha información al respecto de la caza de Mitnick: http://www.takedown.com/

POR QUÉ LO HICE

A principios de este año 2009 asistí a la Ciudad de México al curso Linux Power User (QLX02) del Linux Professional Institue (LPI), en el cual al final del curso tuvimos que demostrar los conocimientos adquiridos mediante un examen teórico-práctico. La parte práctica requería iniciar sesión vía SSH en un servidor y ejecutar una serie de comandos, guardando un registro en el directorio correspondiente de cada alumno. Posteriormente el expositor revisó cada directorio y cada archivo de los ejercicios.

En el momento del examen volvió a mí la idea que unos pocos años atrás tuve cuando di clases en Computación del Golfo (suc. Urano), en una de las materias en las que se enseñaban comandos básicos de MS-DOS. Recuerdo que algunos alumnos -creyendo que no me daría cuenta- hicieron trampa, y en vez de crear los directorios y archivos usando la línea de comandos de MS-DOS utilizaron el Explorador de Windows para dicha tarea. Ahora que miro en retrospectiva pienso que me hubiera gustado que MS-DOS tuviera la misma facilidad y versatilidad del poder del shell de Linux y las aplicaciones GNU como script y scriptreplay, para pedir a los alumnos sus archivos de registro y reproducirlos para evaluar su aprendizaje.

Me despido deseando que esta información les sea útil,
Sidd.

Imagen de bersil
Enviado por bersil el 23 Septiembre, 2009 - 12:31.

Pues te dirè, amigo sidd, que creo que me serà muy util para algo que esoero hacer pronto, el mes pasado instalè Smile, una aplicacion para crear slideshows muy completa, al estilo windows movie maker, en el portatil de mis hijas y, dado que para instalarla en hardy lo recomendado es compilar, pues lo he hecho siguiendo una guia que encontre en la red y queria hacer un tutorial para compartirlo aqui. El problema es (era) que hacerlo por escrito puede resultar poco claro para que lo comprenda un novato, y grabar el proceso con recordmydesktop resultaria en en video demasiado pesado por lo mucho que dura todo el proceso (una media hora si todo va bien), asi que pues, podria rehacer toda la instalacion desde una tty y registrarla con estas herramientas que me acabas de presentar .

Muy interesante, sidd, veremos de aplicarlo proximamente.

Gracias

Imagen de bersil
Enviado por bersil el 25 Septiembre, 2009 - 20:24.

Bueno, finalmente registrè toda la instalaciòn con script, lo subì a la red temporalmente y lo reproduje en otra Pc. Como tutorial no lo voy a presentar ya que es un aburrimiento total para un ser humano ver un proceso de 6 o 7 comandos pero que duran una eternidad.; pero me sirviò para saber como funciona: lo que hace es crear 2 archivos de texto muy livianos y que, para reproducirlos si estan, por ejemplo en un sitio de internet, solo hay que copiarlos en el mismo directorio, situarse en èl desde la consola y ejecutar

$ scriptreplay archivo_tiempo.extensiòn archivo_comandos.extensiòn

Ah, y como extensiòn se puede poner lo que uno quiera, tanto los guardarà de todos modos como archivos de texto.
Ya estoy traduciendo lo que tengo para hacer el tutorial escrito (aunque de francès no entiendo un pito) pero la experiencia bien valiò la pena.

Imagen de siddharta
Enviado por siddharta el 25 Septiembre, 2009 - 21:14.

Me da gusto leer que te ha sido útil el uso de script. Como habrás visto, es muy sencillo su uso.

Quise subir aquí al servidor de Kubuntu-es un archivo .tar.gz conteniendo 2 archivos generados de duración y comandos, pero sólo se permite subir imágenes. Quería ponerlo precisamente para descarga y reproducción como ejemplo de este tutorial ... era sobre la edición de archivos para configurar la conexión a la red.

A mí me gustaría ver tu tutorial :).

Saludos,
Sidd.

Imagen de bersil
Enviado por bersil el 25 Septiembre, 2009 - 21:25.
siddharta escribió:

Quise subir aquí al servidor de Kubuntu-es un archivo .tar.gz conteniendo 2 archivos generados de duración y comandos, pero sólo se permite subir imágenes.

Pero yo los subì sin comprimir, es decir como 2 archivos de texto simple, y pesaban menos de 1 mega cada uno (un poco pesaditos para ser archivos de texto pero lo que pasa es que era la registraciòn de casi 1 hora de proceso). No podrìas, acaso subirlos como archivos de texto?

siddharta escribió:

A mí me gustaría ver tu tutorial :).

Lo siento al ver que pesaban mas de lo permitido aquì en kubuntu-es y en todos los sitios web de almacenamiento gratuito, y lo extremadamente aburrido que resultaba mirarlos (eran solo unos 6 ò 7 comandos pero larguiiiisimos) pues, los eliminè...no pensè que pudiera existir un ser humano que quisiera ver como una pelìcula un proceso taaaan largo.

En un par de dìas, cuando suba el tutorial (escrito) a la wiki comprenderàs

Imagen de bersil
Enviado por bersil el 26 Septiembre, 2009 - 13:17.
siddharta escribió:

Quise subir aquí al servidor de Kubuntu-es un archivo .tar.gz conteniendo 2 archivos generados de duración y comandos, pero sólo se permite subir imágenes.

Retomando el tema, encontrè que tengo alojados aùn en mi sitio web los 2 primeros archivos que hice de prueba (para ver de que iba la cosa antes de embarcarme en un tutorial), son 2 archivos empaquetados en .zip, para los cuales utilicè los mismos nombres del ejemplo de tu entrada de blog, por lo que con un

$ scriptreplay nombre.duracion nombre.comandos

se pueden reproducir. Estaba pensando, si te puede servir que te aloje los tuyos en mi web y aqui en kubuntu-es, ponemos un enlace directo para la descarga.

Bueno, lo dicho, por si quieres probar te dejo los links de descarga a esos 2 archivos de prueba que aun tengo allì (son un simple "update" y su salida)

http://www.bersil.zobyhost.com/page5/nombre.comandos.zip

http://www.bersil.zobyhost.com/page5/nombre.duracion.zip

Imagen de siddharta
Enviado por siddharta el 27 Septiembre, 2009 - 05:25.
bersil escribió:

[...] Estaba pensando, si te puede servir que te aloje los tuyos en mi web y aqui en kubuntu-es, ponemos un enlace directo para la descarga.

Bueno, lo dicho, por si quieres probar te dejo los links de descarga a esos 2 archivos de prueba que aun tengo allì (son un simple "update" y su salida) [...]

Ya probé en mi equipo los archivos que enlazaste, me ha causado gracia ver en mi equipo cómo se reprodujo la serie de comandos que tecleaste en italiano. Definitivamente esto del script y scriptreplay es una muy buena ayuda para tutoriales de la línea de comandos.

Respecto al alojamiento tan amable que has ofrecido te comento que pronto pondré en línea nuevamente un equipo al cual se le quemó la fuente, y ya tengo la pieza. En ese equipo estoy preparando un servido web para algunas cosillas que quiero poner en línea. Agradezco mucho tu ofrecimiento ... de cualquier manera si los lectores han llegado hasta aquí creo que bien podrían probar mientras tanto los archivos que publicaste, hasta que tú los elimines de tu alojamiento.

¡Saludos y gracias por la retroalimentación!

Imagen de bersil
Enviado por bersil el 27 Septiembre, 2009 - 16:10.
siddharta escribió:

me ha causado gracia ver en mi equipo cómo se reprodujo la serie de comandos que tecleaste en italiano.

siddharta escribió:

Definitivamente esto del script y scriptreplay es una muy buena ayuda para tutoriales de la línea de comandos.

Asi es, ayer preparè un sencillo pero "verdadero" tutorial con este metodo; en la reproduccion que viste habras notado que salìa un mensaje de error de GPG de Launchpad.net, bueno antes de proceder a corregir el problema iniciè la grabaciòn con script y solo me queda subirlos a mi web y enlazarlos desde kubuntu-es, supongo que los enlaces se podrìan poner en la seccion de la wiki que trata ese tema.

siddharta escribió:

¡Saludos y gracias por la retroalimentación!

Por nada sidd, es un placer.