lunes, 22 de junio de 2015

Enviar archivos por sftp con Python

Esta es una breve modificación a uno de los scripts creados con anterioridad y que consiste en enviar un archivo por  sftp.   La necesidad en concreto consistía en comparar ambos servidores local y remoto y validar qué archivo faltaba en el remoto que estuviera en el local para proceder a enviarlo y mantener el remoto actualizado.

Este script se guarda con el nombre que quieras, le das permiso de ejecución y lo agregas en un crontab.



import pysftp
import os

servidor_local = os.listdir(r'C:\proyecto\archivos') # Cambiar por la ruta donde se generan los archivos (Amsterdam)

#print servidor_local

os.remove(r"c:\proyecto\res\archivos.txt") # Cambiar por una ruta en Amsterdam, puede ser /tmp/res

for archivos in servidor_local:
    local = open(r"c:\proyecto\res\archivos.txt",'a') # Cambiar por '/tmp/res/archivos.txt','a'
    print 'Archivo local: '+archivos
    local.write(str(archivos)+'\n')
    local.close()

os.remove(r"c:\proyecto\res\remoto.txt") # Cambiar por /tmp/res/remoto.txt
with pysftp.Connection('servidor_remoto.com', username='usuario', password='clave') as sftp:
    with sftp.cd('/tmp'): # Cambiar por la ruta donde quedan los archivos en el servidor remoto
        f = sftp.listdir()
        for files in f:
            remoto = open(r"c:\proyecto\res\remoto.txt",'a') # '/tmp/res/remoto','a'
            print 'Archivos remotos: '+str(f)
            remoto.write(str(files)+'\n')
            remoto.close()

# Comparo archivo local con remoto
os.remove(r"c:\proyecto\res\pendiente.txt") # /tmp/res/pendiente.txt  <- archivo="" archivos.txt="" archivos="" c:="" comparar:="" comparar="" crear="" es:="" este="" f_local="open(r" f_remoto="open(r" for="" full.find="" full="f_remoto.read()" i="" if="" in="" omparar="" print="" proyecto="" que="" r="" remoto.txt="" res="" str="" tienes="" tmp="" vacio="">=0:
        print i,' Existe \n'
    else:
        pendiente = open(r"c:\proyecto\res\pendiente.txt",'a')
        print 'Archivo pendient: '+i
        pendiente.write(str(i)+'\n')
        directorio = os.chdir(r"C:\proyecto\archivos")
        print 'Directorio actual: '+os.getcwd()
        subir=i.split("\n",1)
        # Envio el archivo faltante
        ith pysftp.Connection('servidor_remoto.com', username='usuario', password='clave') as sftp:
            sftp.cd('/tmp')
            sftp.put(str(subir[0]))
        pendiente.close()