Paramiko Falha ao baixar arquivos grandes> 1GB

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

Quando executo a função abaixo, ele baixa o arquivo de origem por cerca de 3 minutos e depois fecha a sessão, mesmo que apenas 38-41MB (varie) de um arquivo de 1-1.6GB tenha sido baixado.

Do arquivo de log do Paramiko, parece que a conexão SSh permanece aberta enquanto a sessão do SFTP é fechada:

DEB [20120913-10: 05: 00.894] thr = 1 paramiko.transport: Mude para novas chaves ... DEB [20120913-10: 05: 06.953] thr = 1 paramiko.transport: Rekeying (acerte 401 pacotes, 1053444 bytes recebidos ) DEB [20120913-10: 05: 07.391] thr = 1 paramiko.transport: kex algos: ['diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1'] chave do servidor: ['ssh -dss '] cliente criptografar: [' aes256-ctr ',' aes192-ctr ',' aes128-ctr ',' aes256-cbc ',' aes192-cbc ',' aes128-cbc ',' twofish-cbc ', 'blowfish-cbc', '3des-cbc', 'arcfour'] servidor encriptar: ['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] '] servidor mac: [' hmac-sha1 ',' hmac-sha1-96 ',' hmac-md5 ',' hmac-md5-96 ',' [email protected] '] compactação do cliente: [' [email protected] ',' zlib ',' nenhum '] compactador do servidor: [' [email protected] ',' zlib ',' none '] cliente lang: [' '] servidor lang: [' '] kex segue? Falso DEB [20120913- 10: 05: 07.421] thr = 1 paramiko.transport: Cifras concordaram: local = aes128-ctr, remoto = aes128-ctr DEB [20120913-10: 05: 07.421] thr = 1 paramiko.transport: usando kex diffie-hellman- group1-sha1; tipo de chave de servidor ssh-dss; cifra: local aes128-ctr, remoto aes128-ctr; mac: local hmac-sha1, remoto hmac-sha1; compressão: local nenhum, remoto nenhum DEB [20120913-10: 05: 07.625] thr = 1 paramiko.transport: Mude para novas chaves ... INF [20120913-10: 05: 10.374] thr = 2 paramiko.transport.sftp: [chan 1] sftp session closed. DEB [20120913-10: 05: 10.388] thr = 2 paramiko.transport: [chan 1] EOF enviado (1)

Após este ponto, o script é encerrado com esta exceção (do bloco sftp.get () try / except)

Não há recursos suficientes para concluir a solicitação

O sistema em si tem gigabytes de espaço livre em disco, então esse não é o problema.

A mesma transferência que o parakmiko falha funciona bem com o FileZilla e com o aplicativo Java que escrevi anos atrás para fazer transferências SFTP. Então eu acho que é um problema com paramiko.

Isso está sendo executado no Windows XP e no Windows Server 2003.

Eu tentei remendar o Paramko 1.17 para que ele atualize as chaves com mais freqüência, mas a transferência ainda gera uma exceção. Python 2.7.3 Paramiko 1.7 com patch do Windows 2003 Sevfer

Idéias?

Informações Adicionais: Falha no servidor Windows XP SP3 e Windows 2003, exatamente o mesmo comportamento e mensagens de erro. sys.version information Window XP Workstation: '2.7.3 (padrão, 10 / Abr / 2012, 23: 31: 26) [MSC v.1500 32 bits (Intel)]' Windows 2003 Server: '2.7.3 (padrão, 10 de abril 2012, 23:31:26) [MSC v.1500 de 32 bits (Intel)] 'Eu atualizei o arquivo packet.py para diminuir o tempo entre as renovações de chave. Não teve efeito sobre o comportamento do sftp.get ().

questionAnswers(4)

yourAnswerToTheQuestion