Automatizando las conexiones ssh y scp con PLINK y PSCP (Windows y Unix)

Muchas veces nos interesa automatizar la conexion SSH o la descarga (download) o envio (upload) de un fichero/s mediante SCP en un servidor remoto del cual no tenemos acceso directo y por tanto tenemos que indicar un login y contraseña en el momento de ejecutar la conexion.

En Unix tenemos muchas formas de automatizar estos scripts (como p.ej usando expect) pero para simplificar el uso de este proceso y que pueda ser probado tambien por usuarios desde Windows (que me imagino les interesara bastante), hoy voy a hablar de las utilidades PSCP y PLINK incluidas en la pagina de descarga de PUTTY.

Para ello conectate a la pagina de Putty (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) y descargate los ficheros plink.exe y pscp.exe o en su

defecto el paquete putty.zip (que ya lleva incluidas todas las utilidades).

plink.exe lo emplearemos para automatizar las conexiones ssh (ejecuciones de comandos), y pscp.exe para las conexiones scp (upload y descarga de ficheros).

Para ello copia estos ficheros a alguna ruta del path, o p.ej a C:/Windows/System32 con lo que ya podrás acceder a ellos directamente desde la consola de Windows.

En el caso de que uses Ubuntu, puedes insalar estos mismos comandos (plink y pscp, en este caso) si instalamos el paquete putty-tools:

sudo apt-get install putty-tools

Veamos como podemos usarlos para ejecutar un comando remoto o enviar ficheros pasando directamente el usuario y la password:

Ejemplo de uso de pscp:

pscp.exe -pw jose TUTORIAL.txt jose@127.0.0.1:/export/TUTORIALES/COMPARTIDO

Aqui p.ejemplo estoy subiendo el fichero TUTORIAL.txt (local) a la ruta remota /export/TUTORIALES/COMPARTIDO de la maquina 127.0.0.1 para el usuario jose y password jose.

Como veis la sintaxis es practicamente identica a la de el comando scp. Si ejecutais plink o pscp sin indicar nada, ya os muestra la ayudan en linea.

Ejemplo de uso de plink:

plink.exe -pw jose jose@127.0.0.1 ls -l

En este caso conecto a la maquina remota 127.0.0.1 como usuario jose, password jose y ejecuto el comando «ls -l»

Tambien podemos escribir un script de comandos y ejecutarlo con el parametro -m. Ejemplo:

plink -pw jose -m BACKUP.sh jose@127.0.0.1

Donde BACKUP.sh es el fichero que contiene la lista de todos los comandos que queremos ejecutar en remoto.

He escrito tambien una pequeña libreria en Python de automatización donde empleo estas utilidades para ejecutar conexiones ssh o scp remotas desde scripting.

La libreria vale tanto para Windows como Linux sin tocar nada pues ya detecta el Sistema operativo que se esta utilizando, unicamente requiere que plink.exe y

pscp.exe esten en el path de Windows o plink y pscp instalados en Linux.

La libreria es una idea de algo más grande que estoy creando para hacer muchas más cosas: lectura de parametros desde Excel. Ejecucion de consultas sobre base de datos Oracle/MySQL/Sqlite.

Filtrado de ficheros, evaluacion de resultados, etc…

En este caso dejo los ficheros: DEMO.py y WOLF.py, DEMO contiene un ejemplillo y en las capturas de pantalla podreis ver que se ejecuta correctamente tanto en Windows como en Linux.

Nota: Si usais Windows y necesitais un servidor SSH para vuestras pruebas locales, podeis usar MobaSSH (http://mobassh.mobatek.net/)

WOLF.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Wolf: Libreria de Automatizacion
Version 1.0 - Creada en Diciembre 2011
@author: lobo
Nota: Iremos ampliando poco a poco sus funciones
Version 1.0 
- Soporte de SCP y SSH mediante las utilidades plink.exe y pscp.exe en Windows o plink y pscp (putty-tools) en Linux
'''
from subprocess import call
from platform import system
import os
class Wolf(object):
    '''
    Limpia la pantalla  
    '''  
    def cls(self):</p>
         os = system()  
        if os == 'Linux':  
            call('clear', shell = True)  
        elif os == 'Windows':  
            call('cls', shell = True)</p>
     '''  
    Crea una variable de entorno  
    '''  
    def export(self,key,value):  
        if (value==None):  
            value="-"  
        os.environ[key]=value  
        print("export "+key+"="+value)</p>
     '''  
    Crea un fichero con el contenido indicado, Expande las variables de entorno.  
    '''  
    def mensaje(self,contenido,fpath):  
        try:  
            f=open(fpath,"wb")  
            contenido=os.path.expandvars(contenido)  
            contenido=os.path.expandvars(contenido)  
            f.write(contenido)  
            f.close()  
            print(fpath+" generado.")  
        except Exception,err:  
            print("Error: "+str(err))</p>
     '''  
    Ejecuta comandos remoto mediante SSH  
    '''  
    def ssh(self,host,user,password,cmds):  
        PLINK_STRING="plink"  
        so = system()  
        if so == 'Linux':  
            PLINK_STRING="plink"  
        elif so == 'Windows':  
            PLINK_STRING="plink.exe"</p>
         #cmds=os.path.expandvars(cmds)  
        #cmds=os.path.expandvars(cmds)</p>
         comando=PLINK_STRING+" "+"-pw "+password+" "+user+"@"+host+" "+cmds  
        print("debug: "+comando)  
        try:  
            os.system(comando)  
        except Exception,err:  
            print("Error: "+str(err))</p>
     '''  
    Ejecuta en remoto el contenido del script indicado  
    '''  
    def sshScript(self,host,user,password,script,fOut=None):  
        PLINK_STRING="plink"  
        so = system()  
        if so == 'Linux':  
            PLINK_STRING="plink"  
        elif so == 'Windows':  
            PLINK_STRING="plink.exe"</p>
         #cmds=os.path.expandvars(cmds)  
        #cmds=os.path.expandvars(cmds)</p>
         comando=PLINK_STRING+" "+"-pw "+password+" -m "+script+" "+user+"@"+host+" "  
        print("debug: "+comando)  
        try:</p>
             stdout = os.popen(comando)  
            OUT=stdout.read()  
            print (OUT)  
            if (fOut!=None):  
                f=open(fOut,"wb")  
                f.write(OUT)  
                f.close()</p>
         except Exception,err:  
            print("Error: "+str(err))</p>
     '''  
    Sube un fichero a remoto  
    '''  
    def upload(self,host,user,password,localfile,remotefile):  
        PSCP_STRING="pscp"  
        so = system()  
        if so == 'Linux':  
            PSCP_STRING="pscp"  
        elif so == 'Windows':  
            PSCP_STRING="pscp.exe"  
        localfile=os.path.expandvars(localfile)  
        localfile=os.path.expandvars(localfile)  
        remotefile=os.path.expandvars(remotefile)  
        remotefile=os.path.expandvars(remotefile)  
        comando=PSCP_STRING+" "+"-pw "+password+" "+localfile+" "+user+"@"+host+":"+remotefile  
        print("debug: "+comando)  
        try:  
            os.system(comando)  
        except Exception,err:  
            print("Error: "+str(err))</p>
     '''  
    Descarga un fichero remoto  
    '''  
    def download(self,host,user,password,remotefile,localfile):  
        PSCP_STRING="pscp"  
        so = system()  
        if so == 'Linux':  
            PSCP_STRING="pscp"  
        elif so == 'Windows':  
            PSCP_STRING="pscp.exe"  
        localfile=os.path.expandvars(localfile)  
        localfile=os.path.expandvars(localfile)  
        remotefile=os.path.expandvars(remotefile)  
        remotefile=os.path.expandvars(remotefile)  
        comando=PSCP_STRING+" "+"-pw "+password+" "+user+"@"+host+":"+remotefile+" "+localfile  
        print("debug: "+comando)  
        try:  
            os.system(comando)  
        except Exception,err:  
            print("Error: "+str(err))</p>
     '''  
    Imprime un texto con expansion de variables  
    '''  
    def echo(self,string):  
        string=os.path.expandvars(string);  
        string=os.path.expandvars(string);  
        print(string)</p>
     '''  
    Constructor  
    '''  
    def __init__(self):  
        '''  
        Constructor  
        '''  
        print("Wolf: Libreria de Automatizacion v1.0")

DEMO.py

#!/usr/bin/python
# Importamos la libreria de Automatizacion
from Wolf import Wolf
# Creamos una instancia de la clase
s=Wolf()
# Indicamos los datos de Acceso a la maquina remota
host="AQUI TU HOST"
user="AQUI TU USER"
password="AQUI TU PASSWORD"
# EJEMPLO_1 : Creamos un script con los comandos a ejecutar.
s.mensaje("cd ${HOME}; cal","SCRIPT_01.sh")
# EJEMPLO_2: Ejecutamos en remoto el script anterior y guardamos sus trazas en Local (fichero TRAZAS.log)
s.sshScript(host,user,password,"SCRIPT_01.sh","TRAZAS.log")
s.echo("Mi directorio HOME es ${HOME}")
# EJEMPLO_3: Descargamos de remoto un fichero mediante pscp
s.download(host, user, password, "/tmp/SSH.log", "./SSH_recuperado.log")

Referencias: http://linux.die.net/man/1/plink | http://linux.die.net/man/1/pscp

8 Respuestas to “Automatizando las conexiones ssh y scp con PLINK y PSCP (Windows y Unix)”


  1. 1 Lobo diciembre 20, 2011 a las 10:20 pm

    LAMENTO!!! QUE SE VEA MAL EL CODIGO

    WordPress me esta dando MUCHISIMOS PROBLEMAS, he tenido que subir las imagenes 15 veces, y no me dejar poner bien el codigo ni subir atachados, espero que se resuelva pronto y pueda editar y dejar bien el POST. Es un boicot en toda regla ^^

    De todas formas quedaos con la idea, y si quereis usar el codigo python limpiarlo de esos tags ADICIONALES de HTML que WordPress me ha metido, puteandome un poco…

  2. 2 german diciembre 21, 2011 a las 7:02 am

    Che… ¿Y qué metacity estás usando? ¿Es gnome3? Abrazo y tranqui.

  3. 4 ivanimatrix diciembre 21, 2011 a las 1:49 pm

    Hola. Qué temas es el de la captura de Windows 7 que muestras en este artículo?? Saludos…

  4. 6 Guido Rolon diciembre 21, 2011 a las 9:43 pm

    buenisimo, gracias por compartir, esto me recuerda mi materia pendiente con python

  5. 7 Daniel diciembre 31, 2012 a las 1:40 pm

    hola necesito una ayuda la cosa es que tengo que automatizar un backup de switch NORTEL el cual pide login,password y luego pide que unda ctrl +y yo utilizo estos comando y me funciona bien hasta que me pide el ctrl y
    plink 172.30.1.1 -l admin -pw 12345
    pues eso me entr al switch pero ahi es donde tengo el problema tengo que escribir ctrl+y si me puedes colaborar muchas gracias.

  6. 8 David May 17, 2013 a las 6:26 am

    Buenas,

    Quiero automatizar un script en Unix y ejecutarlo desde Windows. El script en cuestión funciona correctamente en Unix, lo único que hace es sacar por pantalla una serie de cálculos que realiza internamente. Dónde está el problema… que al ejecutarlo desde Windows el script tarda muy poco en ejecutarse y aunque la salida por pantalla la hace, los cálculos internos no, y los devuelve con valor 0. Esto último lo he realizado utilizando plink.exe, pero como ya he dicho antes, tarda muy poco en ejecutarse y sin el resultado esperado. Agradecería cualquier ayuda.

    Gracias de antemano!!!!


Deja un comentario







¿Es compatible tu equipo con Ubuntu?


( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map

Archivos

diciembre 2011
L M X J V S D
 1234
567891011
12131415161718
19202122232425
262728293031  

Blog Stats

  • 31.401.826 hits