paramiko hangs on get after ownloading 20 MB of file

前端 未结 3 1204
孤独总比滥情好
孤独总比滥情好 2021-01-03 05:56

I am in need of python sftp client to download files from a sftp server. I started to use Paramiko. Small files in KB works well but however when I try to download 600 MB of

相关标签:
3条回答
  • 2021-01-03 06:20

    Increasing default_max_packet_size and default_window_size as follows worked for me:

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.load_system_host_keys()
    
    client.connect(hostname, username=username, password=password, port=port)
    tr = client.get_transport()
    tr.default_max_packet_size = 100000000
    tr.default_window_size = 100000000
    sftp = client.open_sftp()
    sftp.get(remote_file, local_filepath)
    
    client.close()
    
    0 讨论(0)
  • 2021-01-03 06:27

    Using the latest paramiko 2.4.2, I have a similar issue. In my case, our vendor switched their SFTP provider from Globalscape (SSH-2.0-1.82_sshlib Globalscape) to Cerberus (SSH-2.0-CerberusFTPServer_10.0) a few days ago. Ever since then, paramiko has been unable to download a ~450MB file.

    Here is the symptom: The downloading speed is extremely slow. After downloading 20~30MB, it always errors out with: Server connection dropped msg.

    Here is the log (Globalscape) - successful download:

    "paramiko.transport", "DEBUG", "starting thread (client mode): 0x160096d8"
    "paramiko.transport", "DEBUG", "Local version/idstring: SSH-2.0-paramiko_2.4.1"
    "paramiko.transport", "DEBUG", "Remote version/idstring: SSH-2.0-1.82_sshlib Globalscape"
    "paramiko.transport", "INFO", "Connected (version 2.0, client 1.82_sshlib)"
    "paramiko.transport", "DEBUG", "kex algos:['diffie-hellman-group14-sha1', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa'] client encrypt:['twofish256-cbc', 'twofish-cbc', 'twofish128-cbc', 'blowfish-cbc', '3des-cbc', 'arcfour', 'cast128-cbc', 'aes256-cbc', 'aes128-cbc', 'aes256-ctr', 'aes128-ctr'] server encrypt:['twofish256-cbc', 'twofish-cbc', 'twofish128-cbc', 'blowfish-cbc', '3des-cbc', 'arcfour', 'cast128-cbc', 'aes256-cbc', 'aes128-cbc', 'aes256-ctr', 'aes128-ctr'] client mac:['hmac-sha1', 'hmac-md5', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-sha1', 'hmac-md5', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['zlib', 'none'] server compress:['zlib', 'none'] client lang:[''] server lang:[''] kex follows?False"
    "paramiko.transport", "DEBUG", "HostKey agreed: ssh-rsa"
    "paramiko.transport", "DEBUG", "Cipher agreed: aes128-ctr"
    "paramiko.transport", "DEBUG", "MAC agreed: hmac-sha1"
    "paramiko.transport", "DEBUG", "Compression agreed: none"
    "paramiko.transport", "DEBUG", "Got server p (2048 bits)"
    "paramiko.transport", "DEBUG", "kex engine KexGex specified hash_algo <built-in function openssl_sha1>"
    "paramiko.transport", "DEBUG", "Switch to new keys ..."
    "paramiko.transport", "DEBUG", "Attempting public-key auth..."
    "paramiko.transport", "DEBUG", "userauth is OK"
    "paramiko.transport", "INFO", "Auth banner: b'Welcome to the our Secure FTP Server'"
    "paramiko.transport", "INFO", "Authentication (publickey) successful!"
    "paramiko.transport", "DEBUG", "[chan 0] Max packet in: 32768 bytes"
    "paramiko.transport", "DEBUG", "[chan 0] Max packet out: 35840 bytes"
    "paramiko.transport", "DEBUG", "Secsh channel 0 opened."
    "paramiko.transport", "DEBUG", "[chan 0] Sesch channel 0 request ok"
    "paramiko.transport.sftp", "INFO", "[chan 0] Opened sftp connection (server version 3)"
    "paramiko.transport.sftp", "DEBUG", "[chan 0] stat(b'data.csv')"
    "paramiko.transport.sftp", "DEBUG", "[chan 0] open(b'data.csv', 'rb')"
    "paramiko.transport.sftp", "DEBUG", "[chan 0] open(b'data.csv', 'rb') -> 31"
    "paramiko.transport.sftp", "DEBUG", "[chan 0] close(31)"
    "paramiko.transport.sftp", "INFO", "[chan 0] sftp session closed."
    "paramiko.transport", "DEBUG", "[chan 0] EOF sent (0)"
    "paramiko.transport", "DEBUG", "EOF in transport thread"
    

    Here is the log (Cerberus) - failed download:

    "paramiko.transport", "DEBUG", "starting thread (client mode): 0x119706d8"
    "paramiko.transport", "DEBUG", "Local version/idstring: SSH-2.0-paramiko_2.4.1"
    "paramiko.transport", "DEBUG", "Remote version/idstring: SSH-2.0-CerberusFTPServer_10.0"
    "paramiko.transport", "INFO", "Connected (version 2.0, client CerberusFTPServer_10.0)"
    "paramiko.transport", "DEBUG", "kex algos:['ecdh-sha2-nistp256', 'ecdh-sha2-nistp384', 'ecdh-sha2-nistp521', 'diffie-hellman-group-exchange-sha256', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa'] client encrypt:['aes128-ctr', 'aes128-cbc', 'aes192-ctr', 'aes192-cbc', 'aes256-ctr', 'aes256-cbc', '3des-cbc'] server encrypt:['aes128-ctr', 'aes128-cbc', 'aes192-ctr', 'aes192-cbc', 'aes256-ctr', 'aes256-cbc', '3des-cbc'] client mac:['hmac-sha1', 'hmac-sha1-96', 'hmac-sha2-256', 'hmac-sha2-256-96', 'hmac-sha2-512', 'hmac-sha2-512-96', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-md5'] server mac:['hmac-sha1', 'hmac-sha1-96', 'hmac-sha2-256', 'hmac-sha2-256-96', 'hmac-sha2-512', 'hmac-sha2-512-96', 'hmac-ripemd160', 'hmac-ripemd160@openssh.com', 'hmac-md5'] client compress:['none'] server compress:['none'] client lang:['en-US'] server lang:['en-US'] kex follows?False"
    "paramiko.transport", "DEBUG", "Kex agreed: ecdh-sha2-nistp256"
    "paramiko.transport", "DEBUG", "HostKey agreed: ssh-rsa"
    "paramiko.transport", "DEBUG", "Cipher agreed: aes128-ctr"
    "paramiko.transport", "DEBUG", "MAC agreed: hmac-sha2-256"
    "paramiko.transport", "DEBUG", "Compression agreed: none"
    "paramiko.transport", "DEBUG", "kex engine KexNistp256 specified hash_algo <built-in function openssl_sha256>"
    "paramiko.transport", "DEBUG", "Switch to new keys ..."
    "paramiko.transport", "DEBUG", "Attempting public-key auth..."
    "paramiko.transport", "DEBUG", "userauth is OK"
    "paramiko.transport", "INFO", "Authentication (publickey) successful!"
    "paramiko.transport", "DEBUG", "[chan 0] Max packet in: 32768 bytes"
    "paramiko.transport", "DEBUG", "[chan 0] Max packet out: 32768 bytes"
    "paramiko.transport", "DEBUG", "Secsh channel 0 opened."
    "paramiko.transport", "DEBUG", "[chan 0] Sesch channel 0 request ok"
    "paramiko.transport.sftp", "INFO", "[chan 0] Opened sftp connection (server version 3)"
    "paramiko.transport.sftp", "DEBUG", "[chan 0] stat(b'data.csv')"
    "paramiko.transport.sftp", "DEBUG", "[chan 0] open(b'data.csv', 'rb')"
    "paramiko.transport.sftp", "DEBUG", "[chan 0] open(b'data.csv', 'rb') -> 7b45394343333830462d383832352d343436342d393831302d4444373838314237303433367d"
    "paramiko.transport", "DEBUG", "EOF in transport thread"
    

    Adding

    transport.default_window_size = paramiko.common.MAX_WINDOW_SIZE
    

    works for me (at least for now). Not sure what would happen if the file size increases from ~450MB to >>0.5GB.

    0 讨论(0)
  • 2021-01-03 06:28

    I did two things to solve a similar problem:

    1. increase window size – you say you tried that too; for me, this helped to get from a few ten MBs to half a GB but no further

    2. effectively disable rekeying – this might have security implications, but helped me to get files over a GB from a weird windows sftp server

      with paramiko.Transport((_SFTP['host'], 22)) as transport:
          # SFTP FIXES
          transport.default_window_size=paramiko.common.MAX_WINDOW_SIZE
          transport.packetizer.REKEY_BYTES = pow(2, 40)  # 1TB max, this is a security degradation!
          transport.packetizer.REKEY_PACKETS = pow(2, 40)  # 1TB max, this is a security degradation!
          # / SFTP FIXES
      
          transport.connect(username=_SFTP['user'], password=_SFTP['password'])
              with paramiko.SFTPClient.from_transport(transport) as sftp:
                  listdir = sftp.listdir()
                  # ...
                  sftp.get(remotepath=filename, localpath=localpath)
      
    0 讨论(0)
提交回复
热议问题