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

001 #!/usr/bin/python
002 # -*- coding: utf-8 -*-
003 '''
004 Wolf: Libreria de Automatizacion
005 Version 1.0 - Creada en Diciembre 2011
006 @author: lobo
007 Nota: Iremos ampliando poco a poco sus funciones
008 Version 1.0
009 - Soporte de SCP y SSH mediante las utilidades plink.exe y pscp.exe en Windows o plink y pscp (putty-tools) en Linux
010 '''
011 from subprocess import call
012 from platform import system
013 import os
014 class Wolf(object):
015 '''
016 Limpia la pantalla
017 '''
018 def cls(self):</p>
019 os = system()
020 if os == 'Linux':
021 call('clear', shell = True)
022 elif os == 'Windows':
023 call('cls', shell = True)</p>
024 '''
025 Crea una variable de entorno
026 '''
027 def export(self,key,value):
028 if (value==None):
029 value="-"
030 os.environ[key]=value
031 print("export "+key+"="+value)</p>
032 '''
033 Crea un fichero con el contenido indicado, Expande las variables de entorno.
034 '''
035 def mensaje(self,contenido,fpath):
036 try:
037 f=open(fpath,"wb")
038 contenido=os.path.expandvars(contenido)
039 contenido=os.path.expandvars(contenido)
040 f.write(contenido)
041 f.close()
042 print(fpath+" generado.")
043 except Exception,err:
044 print("Error: "+str(err))</p>
045 '''
046 Ejecuta comandos remoto mediante SSH
047 '''
048 def ssh(self,host,user,password,cmds):
049 PLINK_STRING="plink"
050 so = system()
051 if so == 'Linux':
052 PLINK_STRING="plink"
053 elif so == 'Windows':
054 PLINK_STRING="plink.exe"</p>
055 #cmds=os.path.expandvars(cmds)
056 #cmds=os.path.expandvars(cmds)</p>
057 comando=PLINK_STRING+" "+"-pw "+password+" "+user+"@"+host+" "+cmds
058 print("debug: "+comando)
059 try:
060 os.system(comando)
061 except Exception,err:
062 print("Error: "+str(err))</p>
063 '''
064 Ejecuta en remoto el contenido del script indicado
065 '''
066 def sshScript(self,host,user,password,script,fOut=None):
067 PLINK_STRING="plink"
068 so = system()
069 if so == 'Linux':
070 PLINK_STRING="plink"
071 elif so == 'Windows':
072 PLINK_STRING="plink.exe"</p>
073 #cmds=os.path.expandvars(cmds)
074 #cmds=os.path.expandvars(cmds)</p>
075 comando=PLINK_STRING+" "+"-pw "+password+" -m "+script+" "+user+"@"+host+" "
076 print("debug: "+comando)
077 try:</p>
078 stdout = os.popen(comando)
079 OUT=stdout.read()
080 print (OUT)
081 if (fOut!=None):
082 f=open(fOut,"wb")
083 f.write(OUT)
084 f.close()</p>
085 except Exception,err:
086 print("Error: "+str(err))</p>
087 '''
088 Sube un fichero a remoto
089 '''
090 def upload(self,host,user,password,localfile,remotefile):
091 PSCP_STRING="pscp"
092 so = system()
093 if so == 'Linux':
094 PSCP_STRING="pscp"
095 elif so == 'Windows':
096 PSCP_STRING="pscp.exe"
097 localfile=os.path.expandvars(localfile)
098 localfile=os.path.expandvars(localfile)
099 remotefile=os.path.expandvars(remotefile)
100 remotefile=os.path.expandvars(remotefile)
101 comando=PSCP_STRING+" "+"-pw "+password+" "+localfile+" "+user+"@"+host+":"+remotefile
102 print("debug: "+comando)
103 try:
104 os.system(comando)
105 except Exception,err:
106 print("Error: "+str(err))</p>
107 '''
108 Descarga un fichero remoto
109 '''
110 def download(self,host,user,password,remotefile,localfile):
111 PSCP_STRING="pscp"
112 so = system()
113 if so == 'Linux':
114 PSCP_STRING="pscp"
115 elif so == 'Windows':
116 PSCP_STRING="pscp.exe"
117 localfile=os.path.expandvars(localfile)
118 localfile=os.path.expandvars(localfile)
119 remotefile=os.path.expandvars(remotefile)
120 remotefile=os.path.expandvars(remotefile)
121 comando=PSCP_STRING+" "+"-pw "+password+" "+user+"@"+host+":"+remotefile+" "+localfile
122 print("debug: "+comando)
123 try:
124 os.system(comando)
125 except Exception,err:
126 print("Error: "+str(err))</p>
127 '''
128 Imprime un texto con expansion de variables
129 '''
130 def echo(self,string):
131 string=os.path.expandvars(string);
132 string=os.path.expandvars(string);
133 print(string)</p>
134 '''
135 Constructor
136 '''
137 def __init__(self):
138 '''
139 Constructor
140 '''
141 print("Wolf: Libreria de Automatizacion v1.0")

DEMO.py

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

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

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

 

Referencias: linux.die | linux.die..

Fuente: ubuntulife

¿Quién está en línea?

Hay 38786 invitados y ningún miembro en línea