2014-09-22 3 views
1

Я установил SFTP-сервер, используя proftpd на моем локальном компьютере. Он отлично работает, за исключением того, что время при загрузке файлов превышает примерно 30000 символов.Загрузка больших файлов в proftpd через paramiko times out

Загрузка из командной строки через proftpd работает без проблем, а также использование paramiko для загрузки на другой SFTP-сервер также работает. Это заставляет меня думать, что есть ошибка, связанная с взаимодействием между paramiko и proftpd.

Я сделал небольшой скрипт, чтобы проиллюстрировать эту проблему:

import paramiko 

transport = paramiko.Transport(('localhost', 2220)) # my proftpd SFTP port 
transport.connect(username='x', password='x') 
client = paramiko.SFTPClient.from_transport(transport) 
with open('testimage.jpg') as f: # 35241 characters 
    content = f.read() 
with client.open('testimage.jpg', 'w') as f: 
    f.write(content) 

Мой SFTP конкретной конфигурации ProFTPD:

<IfModule mod_sftp.c> 
    <VirtualHost 0.0.0.0> 
     Include   /etc/proftpd/conf.d 
     SFTPEngine   on 
     SFTPLog   /var/log/proftpd/sftp.log 
     Port    2220 
     SFTPHostKey  /etc/ssh/ssh_host_rsa_key 
     SFTPHostKey  /etc/ssh/ssh_host_dsa_key 
     SFTPAuthMethods password 
     SFTPCompression delayed 
     MaxLoginAttempts 3 
    </VirtualHost> 
</IfModule> 

Через 10 минут, программа завершает работу и выкладывает эту ошибку:

Traceback (most recent call last): 
    File "ftptest.py", line 9, in <module> 
    f.write(content) 
    File "/Library/Python/2.7/site-packages/paramiko/file.py", line 330, in write 
    self._write_all(data) 
    File "/Library/Python/2.7/site-packages/paramiko/file.py", line 447, in _write_all 
    count = self._write(data) 
    File "/Library/Python/2.7/site-packages/paramiko/sftp_file.py", line 176, in _write 
    self._reqs.append(self.sftp._async_request(type(None), CMD_WRITE, self.handle, long(self._realpos), data[:chunk])) 
    File "/Library/Python/2.7/site-packages/paramiko/sftp_client.py", line 668, in _async_request 
    self._send_packet(t, msg) 
    File "/Library/Python/2.7/site-packages/paramiko/sftp.py", line 170, in _send_packet 
    self._write_all(out) 
    File "/Library/Python/2.7/site-packages/paramiko/sftp.py", line 135, in _write_all 
    raise EOFError() 
EOFError 

Использование paramiko 1,15 и ProFTPD 1.3.5

ответ

0

Размер окна по умолчанию 4 ГБ был слишком большим для paramiko, в результате чего передача данных была остановлена.

Проблема была решена путем добавления этого к конфигурации ProFTPD SFTP:
SFTPClientMatch ".*" channelWindowSize 3999MB