Paramiko no puede descargar archivos de gran tamaño> 1 GB

def download():
if os.path.exists( dst_dir_path ) == False:
    logger.error( "Cannot access destination folder %s. Please check path and permissions. " % ( dst_dir_path ))
    return 1
elif os.path.isdir( dst_dir_path ) == False:
    logger.error( "%s is not a folder. Please check path. " % ( dst_dir_path ))
    return 1

file_list = None
#transport = paramiko.Transport(( hostname, port)) 
paramiko.util.log_to_file('paramiko.log')
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
#transport
try:
    ssh.connect( hostname, username=username, password=password, timeout=5.0) 
    #transport.connect(username=username, password=password ) 
except Exception, err:
    logger.error( "Failed to connect to the remote server. Reason: %s" % ( str(err) ) )
    return 1

try:
    #sftp = paramiko.SFTPClient.from_transport(transport)
    sftp = ssh.open_sftp() 
except Exception, err:
    logger.error( "Failed to start SFTP session from connection to %s. Check that SFTP service is running and available. Reason: %s" % ( hostname, str(err) ))
    return 1

try:    
    sftp.chdir(src_dir_path)
    #file_list = sftp.listdir(path="%s" % ( src_dir_path ) )
    file_list = sftp.listdir()

except Exception, err:
    logger.error( "Failed to list files in folder %s. Please check path and permissions. Reason: %s" % ( src_dir_path, str(err) ))
    return 1
match_text = re.compile( file_mask )
download_count = 0
for file in file_list:         
    # Here is an item name... but is it a file or directory?         
    #logger.info( "Downloading file %s." % ( file ) )
    if not re.match( file_mask, file ):
        continue
    else:
        logger.info( "File \"%s\" name matched file mask \"%s\". matches %s.Processing file..." % ( file, file_mask, (match_text.match( file_mask ) ) ) )
    src_file_path = "./%s" % ( file )
    dst_file_path = "/".join( [ dst_dir_path, file]   )
    retry_count = 0
    while True:
        try:
            logger.info( "Downloading file %s to %s."  % ( file, dst_file_path ) )
            #sftp.get( file, dst_file_path, callback=printTotals ) #sftp.get( remote file, local file )
            sftp.get( file, dst_file_path) #sftp.get( remote file, local file )
            logger.info( "Successfully downloaded file %s to %s."  % ( file, dst_file_path ) )
            download_count += 1
            break
        except Exception, err:
            if retry_count == retry_threshold:
                logger.error( "Failed to download %s to %s. Reason: %s." % ( file, dst_file_path, str(err) ) )
                sftp.close() 
                #transport.close()
                return 1
            else:
                logger.error( "Failed to download %s to %s. Reason: %s." % ( file, dst_file_path, str(err) ) )
                retry_count +=1

sftp.close() 
transport.close() 
logger.info( "%d files downloaded." % ( download_count ) )
return 0

Cuando ejecuto la siguiente función, descarga el archivo de origen durante aproximadamente 3 minutos y luego cierra la sesión, aunque solo se han descargado 38-41MB (varía) de un archivo de 1-1.6GB.

Desde el archivo de registro de Paramiko, parece que la conexión SSh permanece abierta mientras se cierra la sesión SFTP:

DEB [20120913-10: 05: 00.894] thr = 1 paramiko.transport: Cambiar a nuevas claves ... DEB [20120913-10: 05: 06.953] thr = 1 paramiko.transport: Rekeying (golpee 401 paquetes, 1053444 bytes recibidos ) DEB [20120913-10: 05: 07.391] thr = 1 paramiko.transport: kex algos: ['diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1'] clave del servidor: ['ssh -dss '] cifrado del cliente: [' aes256-ctr ',' aes192-ctr ',' aes128-ctr ',' aes256-cbc ',' aes192-cbc ',' aes128-cbc ',' twofish-cbc ', 'blowfish-cbc', '3des-cbc', 'arcfour'] server encrypt: ['aes256-ctr', 'aes192-ctr', 'aes128-ctr', 'aes256-cbc', 'aes192-cbc', 'aes128-cbc', 'twofish-cbc', 'blowfish-cbc', '3des-cbc', 'arcfour'] cliente mac: ['hmac-sha1', 'hmac-sha1-96', 'hmac-md5 ',' hmac-md5-96 ',' [email protected] '] server mac: [' hmac-sha1 ',' hmac-sha1-96 ',' hmac-md5 ',' hmac-md5-96 ',' [email protected] '] compresión del cliente: [' [email protected] ',' zlib ',' ninguna '] compresión del servidor: [' [email protected] ',' zlib ',' ninguna '] cliente lang: [' '] idioma del servidor: [' '] kex sigue? False DEB [20120913- 10: 05: 07.421] thr = 1 paramiko.transport: Cifras acordadas: local = aes128-ctr, remote = aes128-ctr DEB [20120913-10: 05: 07.421] thr = 1 paramiko.transport: utilizando kex diffie-hellman- grupo1-sha1; tipo de clave de servidor ssh-dss; cifrado: local aes128-ctr, remoto aes128-ctr; mac: local hmac-sha1, hmac-sha1 remoto; compresión: local ninguno, remoto ninguno DEB [20120913-10: 05: 07.625] thr = 1 paramiko.transport: Cambiar a nuevas teclas ... INF [20120913-10: 05: 10.374] thr = 2 paramiko.transport.sftp: [chan 1] sesión sftp cerrada. DEB [20120913-10: 05: 10.388] thr = 2 paramiko.transport: [chan 1] EOF enviado (1)

Después de este punto, la secuencia de comandos se cierra con esta excepción (del bloque try / except sftp.get ())

No hay recursos suficientes para completar la solicitud.

El sistema en sí tiene gigabytes de espacio libre en disco, por lo que ese no es el problema.

La misma transferencia en la que falla la parakmiko funciona bien con FileZilla y con la aplicación Java que escribí hace años para hacer transferencias de SFTP. Así que creo que es un problema con paramiko.

Esto se está ejecutando en Windows XP y en Windows Server 2003.

He intentado parchear Paramko 1.17 para que actualice las teclas con más frecuencia, pero la transferencia todavía produce un error. Python 2.7.3 Paramiko 1.7 con parche Windows 2003 Sevfer

Ideas?

Información adicional: Falla en el servidor de Windows XP SP3 y Windows 2003, exactamente el mismo comportamiento y mensajes de error. Información de sys.version Windows XP Workstation: '2.7.3 (predeterminado, 10 de abril de 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]' Windows 2003 Server: '2.7.3 (predeterminada, 10 de abril 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] 'Parché el archivo packet.py para disminuir el tiempo entre renovaciones de claves. No tuvo ningún efecto en el comportamiento de sftp.get ().

Respuestas a la pregunta(4)

Su respuesta a la pregunta