rsyn sobre SSH con Python Pexpect. Automatizando procesos y accesos.

Ahora mismo tengo que trabajar en remoto en otro ordenador, más concretamente tengo que escribir código para después compilarlo y ejecutarlo en ese ordenador.

Todo debe parecer normal, pero la verdad que es tedioso para mi no tener un entorno de programación donde poder tener abiertos todos los ficheros necesarios… Y si contamos con que soy un torpe escribiendo las contraseñas y la orden de ssh para realizar la conexión… Pues bien, he decidido automatizarlo por medio de Python.

Nota; ya sé que ssh permite generar claves y todo eso, pero en este caso, por razones de seguridad el ordenador al que accedo no permite ese protocolo de acceso.

He encontrado un par de soluciones, os presento la que a mí más me ha convencido:

Crear un script de acceso es fácil, vamos a ver la orden de sincronización de archivos que tiene más miga y seguro que a partir de ella sacáis las ideas para hacerlo sin demasiado esfuerzo.

1.- Necesitaremos ssh. Viene por defecto en la mayoría de sistemas *NIX. Comprobadlo con la orden ssh y si no lo tenéis se instala sin problemas.

2.- Para sincronizar los archivos de un directorio no me vale ssh a secas porque no permite este tipo de cosas. (Al menos hasta donde se).
Vamos a utilizar la herramienta srync que puede trabajar sobre ssh sin problemas (requisito indispensable para mí).

Ahora trabajo en Mac pero es igual de fácil que en Linux instalar todo, en la web del proyecto os proporcionan una serie de comandos que desde la terminal se encargan de todo.

3.- Quiero automatizar el proceso de sincronización y ello implica automatizar el acceso, es decir “escribir la contraseña”. Bien, en Python no me ha convencido dada hasta que he encontrado el modulo Pexpect. En esa misma web tenéis varios ejemplos que muestran lo intuitivas que son las órdenes, y es que está hecho a medida.

4.- Juntamos todo y tendremos nuestro programa listo:

import pexpect
import os as os


def inicio_transferencia ():
        print “———————————————————————————————-“
print ”               SCRIPT PARA SINCRONIZACION DE ARCHIVOS                 “
print “———————————————————————————————-“


def cierre_transferencia():
        print “————————————————————————————————“
print ”              SINCRONIZACION DE ARCHIVOS COMPLETADA                  “
print “————————————————————————————————“




inicio_transferencia()


child = pexpect.spawn (‘rsync -rvuh -e “ssh -p 2222” –stats –progress –exclude “/sync_folder/.” –exclude “/sync_folder/..” /sync_folder USER@DIRECCION_IP:/home/’)


child.expect (“USER@DIRECCION_IP’s password:”) #debeis poner la salida de vuestro sistema en este punto.


print “… Autentificando, espere unos segundos.”


child.sendline (“pass”) #substituimos por nuestra clave de acceso.
child.interact()


cierre_transferencia()


5.- El script funciona perfectamente y devuelve información sobre la transferencia como podéis ver en la imagen. Si no queréis salida alguna, quitad el comando que devuelve el control a la terminal (child.interact() ) y listo. En ese caso yo implementaría una función de error.

Mezclar estas herramientas permite hacer muchas cosas. Particularmente pexpect me ha gustado mucho,   respecto a os.system() permite el login lo cual da mucho juego para según que cosas, en su contra tiene que no es una librería estándar y sobre todo que debes conocer parte de la salida que te va a ofrecer el sistema, por ello desde mi punto de vista son más potentes combinados.

Esta entrada fue publicada en Sin categoría. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s