feedburner

Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua.

Script para grabar lo que se hace en un shell ( ssh )

Etiquetas:

Por mi trabajo debo documentar las acciones que ejecuto en los hosts de los clientes con total fidelidad. Hace un tiempo estuve buscando alguna herramienta tipo gnome-terminal ( o consola virtual ) con la posibilidad de guardar el log de toda la entrada/salida que realizara dentro de dicha terminal. Esta funcionalidad me sería muy útil no tan solo para poder realizar la documentación que quiero ofrecer, sino también para poder disponer de forma rápida de ejemplos prácticos de ejecución de comandos vía terminal o como log de algún conjunto de acciones particulares. De momento no he encontrado ningún terminal con esa funcionalidad ( tampoco he hecho una búsqueda exahustiva ) pero si que encontré la aplicación propia de bash script que permite hacer algo parecido. Mediante un shell que he montado, automáticamente se graba toda la entrada/salida de lo que ejecuto a través de un ssh, guardándome el log en un directorio predeterminado y organizado por hosts accedidos. El nombre del fichero de log me indica con que usuario realicé el ssh y en que momento. Os dejo aquí el script ( en mis ejemplos se llama fer_ssh2.sh ) por si os es útil o por si os lo puede ser con las modificaciones que creáis oportunas. También adjunto un ejemplo de salida de ejecuciones así como el aspecto del directorio de log para que sirva de ejemplo de lo que he contado.


#!/bin/bash
CADENA=$1
DIRBASE=$HOME/logs_ssh2
FECHA=`date +%Y%m%d-%H.%M.%S`
ELHOST=${CADENA#*@}
ELUSER=${CADENA%@*}
DIRLOG=$DIRBASE/$ELHOST
if [ -d $DIRLOG ]; then
# si existe no hacemos nada - TODO: mirar si podemos negar el if
echo "1" > /dev/null
#el directorio existe, seguimos
else
mkdir -p $DIRLOG
fi
LOG=$DIRLOG/$FECHA-$ELUSER.log
echo "**************************************************"
echo "* HACIENDO SSH CONTRA $1"
echo "* Guardando log en $LOG"
echo "**************************************************"
script -c "ssh -X $1" $LOG
exit


  • Salida real del terminal donde lanzo fer_ssh2.sh ( contra mi propio host vía nombre máquina )


dballester@nebuchadnezzar:~$ fer_ssh2.sh dballester@nebuchadnezzar
**************************************************
* HACIENDO SSH CONTRA dballester@nebuchadnezzar
* Guardando log en /home/dballester/logs_ssh2/nebuchadnezzar/20071220-12.19.26-dballester.log
**************************************************
Script iniciado; el fichero es /home/dballester/logs_ssh2/nebuchadnezzar/20071220-12.19.26-dballester.log
The authenticity of host 'nebuchadnezzar (127.0.1.1)' can't be established.
RSA key fingerprint is af:6e:94:98:83:e1:d3:22:a9:c2:cf:d7:28:3a:59:c3.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'nebuchadnezzar' (RSA) to the list of known hosts.
dballester@nebuchadnezzar's password:
Linux nebuchadnezzar 2.6.22-14-generic #1 SMP Sun Oct 14 23:05:12 GMT 2007 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
You have mail.
Last login: Thu Dec 20 11:59:12 2007 from localhost
dballester@nebuchadnezzar:~$ hostname
nebuchadnezzar
dballester@nebuchadnezzar:~$ df -h
S.ficheros Tamaño Usado Disp Uso% Montado en
/dev/sda6 4,6G 3,9G 536M 88% /
varrun 502M 112K 502M 1% /var/run
varlock 502M 0 502M 0% /var/lock
udev 502M 108K 502M 1% /dev
devshm 502M 0 502M 0% /dev/shm
lrm 502M 34M 468M 7% /lib/modules/2.6.22-14-generic/volatile
/dev/mapper/data-homes
30G 16G 13G 56% /home
/dev/sda1 76M 41M 32M 57% /boot
/dev/mapper/data-oracle11g
7,9G 5,9G 1,6G 79% /u01
/dev/scd0 7,6G 7,6G 0 100% /media/cdrom0
dballester@nebuchadnezzar:~$ exit
logout
Connection to nebuchadnezzar closed.
Script terminado; el fichero es /home/dballester/logs_ssh2/nebuchadnezzar/20071220-12.19.26-dballester.log
dballester@nebuchadnezzar:~$



  • Salida real del terminal donde lanzo fer_ssh2.sh ( contra mi propio host vía localhost )

dballester@nebuchadnezzar:~$ fer_ssh2.sh dballester@localhost
**************************************************
* HACIENDO SSH CONTRA dballester@localhost
* Guardando log en /home/dballester/logs_ssh2/localhost/20071220-12.21.35-dballester.log
**************************************************
Script iniciado; el fichero es /home/dballester/logs_ssh2/localhost/20071220-12.21.35-dballester.log
dballester@localhost's password:
Linux nebuchadnezzar 2.6.22-14-generic #1 SMP Sun Oct 14 23:05:12 GMT 2007 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
You have mail.
Last login: Thu Dec 20 12:19:33 2007 from nebuchadnezzar
dballester@nebuchadnezzar:~$ ifconfig | grep -A2 Ether
eth0 Link encap:Ethernet HWaddr 00:14:22:A2:5E:86
inet addr:172.31.152.20 Bcast:172.31.152.255 Mask:255.255.255.0
inet6 addr: fe80::214:22ff:fea2:5e86/64 Scope:Link
dballester@nebuchadnezzar:~$ mii-tool
SIOCGMIIPHY on 'eth0' failed: Operation not permitted
SIOCGMIIPHY on 'eth1' failed: Operation not permitted
SIOCGMIIPHY on 'eth2' failed: Operation not permitted
SIOCGMIIPHY on 'eth3' failed: Operation not permitted
SIOCGMIIPHY on 'eth4' failed: Operation not permitted
SIOCGMIIPHY on 'eth5' failed: Operation not permitted
SIOCGMIIPHY on 'eth6' failed: Operation not permitted
SIOCGMIIPHY on 'eth7' failed: Operation not permitted
no MII interfaces found
dballester@nebuchadnezzar:~$ sudo mii-tool
[sudo] password for dballester:
eth0: no autonegotiation, 10baseT-HD, link ok
SIOCGMIIPHY on 'eth1' failed: Operation not supported
dballester@nebuchadnezzar:~$




  • Aspecto de los directorios de log

dballester@nebuchadnezzar:~$ ls -lR logs_ssh2
logs_ssh2:
total 36
drwxr-xr-x 2 dballester dballester 4096 2007-12-20 12:23 localhost
drwxr-xr-x 2 dballester dballester 4096 2007-12-20 12:19 nebuchadnezzar

logs_ssh2/localhost:
total 16
-rw-r--r-- 1 dballester dballester 4096 2007-12-20 12:22 20071220-12.21.35-dballester.log
-rw-r--r-- 1 dballester dballester 131 2007-12-20 12:23 20071220-12.23.10-dballester.log

logs_ssh2/nebuchadnezzar:
total 4
-rw-r--r-- 1 dballester dballester 1795 2007-12-20 12:19 20071220-12.19.26-dballester.log
dballester@nebuchadnezzar:~$

10 comentarios:
gravatar
Andrés Fang dijo...
martes, 18 de marzo de 2008, 6:29:00 CET  

La verdad no entendí nada, yo quiero hacer lo mismo pero lo máximo que he logrado es ponerle a todas las instrucciones
$ rm /home/mypc/foto.jpg >> consola.txt

pues el ">> consola.txt" pero no es muy fiel que digamos para guardar todo ¿será que podrías explicar un poco mejor? exactamente qué escribes en la consola??

gravatar
dballester dijo...
martes, 18 de marzo de 2008, 10:26:00 CET  

Hola Andrés:

script es un comando de shell que lo que hace es guardar la entrada/salida de lo que ejecutes a partir de ese momento. Para terminar con lo que podríamos llamar, 'la grabación' del terminal, ejecutamos exit.

En el ejemplo siguiente pongo a grabar el terminal guardando la grabación en el fichero prueba.log y luego visualizo el contenido de dicho log:


*llamamos a script indicando que queremos usar el fichero prueba.log para guardar en contenido:

dballester@nebuchaddnezzar:~$ script prueba.log
Script iniciado; el fichero es prueba.log




*script nos devuelve el terminal, a partir de ahora todo lo que hagamos quedará grabado en el fichero prueba.log

dballester@nebuchaddnezzar:~$ ls *.log
hs_err_pid10460.log hs_err_pid8905.log hs_err_pid8999.log java0.log
hs_err_pid8875.log hs_err_pid8962.log hs_err_pid9154.log prueba.log
dballester@nebuchaddnezzar:~$ rm java0.log


* si ejecutamos 'exit' script termina y cierra a grabación, devolviéndonos el terminal otra vez

dballester@nebuchaddnezzar:~$ exit
exit
Script terminado; el fichero es prueba.log


* ahora podemos mirar en el fichero prueba.log que es lo que nos ha dejado script, que es la grabación de todo lo que hemos hecho mientras script estaba grabando

dballester@nebuchaddnezzar:~$ cat prueba.log
Script iniciado (mar 18 mar 2008 10:01:16 CET
)dballester@nebuchaddnezzar:~$ ls *.log
hs_err_pid10460.log hs_err_pid8905.log hs_err_pid8999.log java0.log
hs_err_pid8875.log hs_err_pid8962.log hs_err_pid9154.log prueba.log
dballester@nebuchaddnezzar:~$ rm java0.log
dballester@nebuchaddnezzar:~$ exit
exit

Script terminado (mar 18 mar 2008 10:01:39 CET
)dballester@nebuchaddnezzar:~$



Lo que yo hago es realizar las conexiones ssh dentro de script, con lo que todo lo que hago contra servidores vía ssh queda grabado en un log personalizado.



Depende de lo que quieras guardar puede interesarte la redirección de la salida standard de los comandos de shell. Por defecto, la ejecución de un comando acepta la entrada ( stdin ) de datos por teclado, la salida standard ( stdout ) por pantalla y la salida de errores ( stderr ) por pantalla también. Para guardar stdout y stderr en un fichero de log puedes redireccionar ambas salidas a este, por ejemplo

si intentamos borrar un fichero que no existe, rm nos devolverá un mensaje de error indicándolo.

Con tu ejemplo, en consola.txt no te aparecerá nada, ya que estás redireccionando la salida standard ( stdout ) y no la salida de errores ( stderr ) que es por donde rm está indicando el error.

Si ejecutas

rm /home/mypc/foto.jpg 2>> consola.txt

el aviso de error por parte de rm si foto.jpg no existe, quedará grabado en consola.txt

Si quieres que tanto la salida standard como la de errores se guarden en consola.txt, ejecuta

rm /home/mypc/foto.jpg &>> consola.txt

( ten en cuenta que todos los mensajes pasarán a grabarse en consola.txt, así que desde tu terminal no verás nada de la ejecución del rm )

Échale un ojo a http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html


Saludos
D.

gravatar
Andrés Fang dijo...
martes, 18 de marzo de 2008, 14:36:00 CET  

Hola DBallester:

Muchas gracias por tu pronta respuesta y por la claridad de la misma, esta vez si he entendido todo y me ha parecido genial, además es justo lo que estaba buscando o pues jejeje es que eso guarda TODO si borro, tabulo o algo el me lo graba lamento preguntar tanto pero...¿hay una forma de controlar eso aparte de no equivocarme?

Nuevamente mil gracias, hacía un buen rato estaba tratando de hacer un log de esa forma, que estés muy bien.

Andrés.

gravatar
dballester dijo...
martes, 18 de marzo de 2008, 15:31:00 CET  

No Andrés, no hay manera de decirle a script que lo haga 'human readable'. PEro puedes usar sed o vi para 'limpiar' el texto de carteres no legibles

gravatar
Andrés Fang dijo...
martes, 18 de marzo de 2008, 17:41:00 CET  

Vale, de todas formas muchísimas gracias!

gravatar
Andrés Fang dijo...
miércoles, 19 de marzo de 2008, 2:05:00 CET  

Hola DBallester nuevamente, te escribo porque estaba usando el script tal cuál como lo habías mencionado pero ya me he encontrado con un lío ¿puedo reescribirlo? porque ya perdí el primer script que tenía al volver a abrir la consola y tratar de continuar trabajando con él, no sé si me puedas hacer el favor de decirme cómo seguir trabajando con el que tenía o simplemente tengo crear siempre uno nuevo.... de antemano te doy las gracias.

gravatar
Andrés Fang dijo...
jueves, 10 de abril de 2008, 3:38:00 CEST  

Por Dios he vuelto a tu página dballester para darte la solución que más me ha
gustado para tener un log de todo lo que escribo en la consola: file:///home/whitefang/.bash_history

en mi caso mi usuario es whitefang cada cuál tendrá el suyo y ahí encontrarás tooodo lo que has escrito (no lo que te retorna) pero es justo lo que buscaba, además es humanamente leíble, que tengas un feliz resto de vida ya que no creo pasar por acá nuevamente.

gravatar
dballester dijo...
jueves, 10 de abril de 2008, 11:13:00 CEST  

Hola Andrés:

Efectivamente en .bash_history se guardan los últimos comandos ejecutados vía terminal pero como bien dices también, solo se guarda la sentencia ejecutada - no su salida - y lo que es más importante, el posible grupo de comandos que puedas ejecutar dentro de un script tampoco se verán reflejados en este fichero. Además, debes tener en cuenta que:

El control del contenido de .bash_history es configurable por lo que puedes encontrarte con una configuración en la que solo se guarden los últimos 2 comandos o peor, que no se guarde ninguno.

Puedes ejecutar comandos erróneos y no puedes saber a posteriori si ese comando que ejecutaste dió el resultado esperado o no.

El contenido de .bash_history solo se actualiza cuando haces logout/exit del terminal que estabas utilizando.


Si relees el post, mis necesidades no pueden ser cubiertas por la información que se guarda en .bash_history, de ahí que buscara modos alternativos de cubrirlas, que es lo que hace en esencia el conjunto de scripts que describo en este post.

A quién pueda leer este thread: Ojo con .bash_history, un admin con mala leche puede configurar la variable

HISTCONTROL: ignorespace

y preovocar que cualquier comando ejecutado con un espacio como primer caracter de la linea, no se guarde en .bash_history, haciendo invisible en el histórico comandos ejecutados realmente.

Andrés, suerte a tí también y que consigas lo que buscas ;)

gravatar
Anónimo dijo...
lunes, 4 de enero de 2010, 1:52:00 CET  

Hola: Perdón x la molestia, la verdad no tengo ni idea de creación de script, x ello quería consultarte si hay alguna solucion para mi problema.

estoy jugando en una web 1 juego online y me da 3 botones de publicidad para votar las 3 webs y a cambio me sube la cantidad de dinero en el juego. se puede copiar ésto para poder hacerlo todas las veces q yo quiera y no tener q esperar hasta el día siguiente?

Gracias.

Si pudieses responderme vía mail te agradecería...

vaelmail@gmail.com
Miguel

gravatar
julio dijo...
viernes, 20 de mayo de 2011, 9:05:00 CEST  

Hola me gustaría saber
Me sale un comentario casi siempre que estoy utilizando el internet´que me dice: este script está siendo utilizado ahora ¿eso significa que alguien me está espiando?
significa que alguna persona tiene un script en la red que estoy utilizando para saber mis entras y salidas de internet?
Eso no es una violación a la privacidad?

Publicar un comentario