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

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

#print servidor_local

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

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

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

# Comparo archivo local con remoto
# /tmp/res/pendiente.txt=0:
os.remove(r"c:\proyecto\res\pendiente.txt") 
        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()
   
 

No hay comentarios: