Python 3.x paramiko在加载20MB文件后挂起get

Python 3.x paramiko在加载20MB文件后挂起get,python-3.x,ssh,paramiko,Python 3.x,Ssh,Paramiko,我需要python sftp客户端从sftp服务器下载文件。我开始使用Paramiko。KB大小的小文件运行良好,但当我尝试下载600MB的文件时,它在下载20MB的文件后无限期地挂起。无法找出问题所在。增加窗口大小也不能解决问题。任何帮助都将不胜感激 host = config.getsafe(section, "host") username = config.getsafe(section, "username") port = config.getsafe(section, "port"

我需要python sftp客户端从sftp服务器下载文件。我开始使用Paramiko。KB大小的小文件运行良好,但当我尝试下载600MB的文件时,它在下载20MB的文件后无限期地挂起。无法找出问题所在。增加窗口大小也不能解决问题。任何帮助都将不胜感激

host = config.getsafe(section, "host")
username = config.getsafe(section, "username")
port = config.getsafe(section, "port")
remote_dir = config.getsafe(section, "remote_dir")
download_dir = config.getsafe(section, "download_dir")
archive_dir = config.getsafe(section, "archive_dir") if config.has_option(section, "archive_dir") else \
    None
password = config.getsafe(section, "password") if config.has_option(section, "password") else None
file_pattern = config.getsafe(section, "file_pattern") if config.has_option(section, "file_pattern") \
    else "*"
passphrase = config.getsafe(section, "passphrase") if config.has_option(section, "passphrase") else None
gnupg_home = config.getsafe(section, "gnupg_home") if config.has_option(section, "gnupg_home") else None

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=host, port=int(port), username=username, password=password)

sftp = ssh.open_sftp()
sftp.sshclient = ssh

sftp.get("/SFTP/PL_DEV/test.dat", "C:/import/download/test.dat")

我做了两件事来解决类似的问题:

  • –你说你也试过了;对我来说,这有助于从几十兆字节提高到半兆字节,但不能再提高了

  • –这可能会带来安全隐患,但帮助我从一台奇怪的windows sftp服务器上获取超过GB的文件

    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)
    

  • 按如下方式增加默认\u最大\u数据包大小和默认\u窗口大小对我有效:

    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()
    

    使用最新的paramiko 2.4.2,我有一个类似的问题。在我的例子中,我们的供应商几天前将他们的SFTP提供商从
    Globalscape
    (SSH-2.0-1.82_sshlib Globalscape)切换到
    Cerberus
    (SSH-2.0-CerberusFTPServer_10.0)。从那时起,帕拉米科一直无法下载~450MB的文件

    症状如下: 下载速度非常慢。下载20~30MB后,总是会出现以下错误:
    服务器连接已断开消息。

    以下是日志(Globalscape)-成功下载:

    "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"
    
    "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"
    

    对我有用(至少现在是这样)。不确定如果文件大小从~450MB增加到>>0.5GB会发生什么情况。

    执行数据包捕获(使用Wireshark)以准确了解发生了什么情况。另外,请尝试使用独立SFTP客户端下载相同的文件,并查看是否有效。类似filezilla的独立SFTP客户端工作得非常完美让我补充一点,在~2GB之后,使用此方法传输速度仍然会减慢:(你能解释一下
    #1TB max,这是一种安全性降低!
    ?这意味着什么?@YuChen SSH应该在传输了一定数量的数据(默认值:1GB)后重新执行密钥交换机制(即同意新的加密密钥)使连接更安全。此解决方案将限制提高到了如此之高,以至于它实际上禁用了密钥更新,即整个传输将使用在客户端和服务器之间传输开始时商定的相同加密密钥。某些旧服务器不支持密钥更新,这就是可能需要此解决方案的原因。有关更多解释,请参阅ON不使用2.2GB文件
    transport.default_window_size = paramiko.common.MAX_WINDOW_SIZE