2016-10-18 3 views
1

У меня проблемы с FTP_TLS (ftplib) в Python 2.7.3.Ошибка EOF с ftplib только при подключении к серверу, размещенному на GoDaddy

Резюме выводов (все попытки соединения выполняются через Интернет):

  • FileZilla на главную веб-сервер - работает
  • FileZilla на GoDaddy виртуальный хостинг сервер - работает
  • Python на главную веб-сервер - работает
  • Python для GoDaddy общий хостинг-сервер - терпит неудачу (см стека ниже)

Следующий код показывает, как я воспроизвожу проблему. При подключении к моему домашнему серверу этот код генерирует идентичный журнал моего личного FTP как FileZilla. (Только при подключении к сайту GoDaddy это приводит к исключению EOF).

from ftplib import FTP_TLS 
o = FTP_TLS(ftpServer,ftpUsername,ftpPassword,ftpPort) 
o.voidcmd('SYST') 
o.voidcmd('FEAT') 
o.prot_p() 
o.voidcmd('PWD') 
o.retrbinary('MLSD', open('OUTTEST', 'wb').write) 
>>> o.retrbinary('MLSD', open('OUTTEST', 'wb').write) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/ftplib.py", line 703, in retrbinary 
    return self.voidresp() 
    File "/usr/lib/python2.7/ftplib.py", line 225, in voidresp 
    resp = self.getresp() 
    File "/usr/lib/python2.7/ftplib.py", line 211, in getresp 
    resp = self.getmultiline() 
    File "/usr/lib/python2.7/ftplib.py", line 197, in getmultiline 
    line = self.getline() 
    File "/usr/lib/python2.7/ftplib.py", line 187, in getline 
    if not line: raise EOFError 

Я прочитал, что ошибка EOF задается, когда сервер закрывает трубу. Это также похоже на то, что происходит, если вы перейдете на prot_p, а затем попытаетесь выпустить команду простого текста (хотя, насколько я могу судить, здесь это не так).

Я не понимаю, что отличает мой код от FileZilla. Тот факт, что все попытки выполняются через Интернет, успокаивает меня, что он не связан с брандмауэрами. Кроме того, FileZilla работает, поэтому с технической точки зрения соединение возможно, мне просто трудно достичь его с помощью Python.

Мой код работает с FTP GoDaddy, если я не выдаю переключатель prot_p.

Дополнительная информация:

  • GoDaddy не предоставляет технических журналов FTP (только использование журналы)
  • Мой код работает безупречно в течение года, это только начало происходить два месяца назад.
  • GoDaddy FTP-сервер идентифицирует как "Pure-Ftpd [privsep] [TLS]"

Типичные FileZilla Server Log после того, как работает мой код.

(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> Connected on port 21, sending welcome message... 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> 220-FileZilla Server 0.9.57 beta 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> 220-written by Tim Kosse ([email protected]) 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> 220 Please visit https://filezilla-project.org/ 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> AUTH TLS 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> 234 Using authentication type TLS 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> SSL connection established 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> USER ******************** 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> 331 Password required for USER_NAME 
(000132)18/10/2016 15:44:19 - (not logged in) (IP_ADDRESS)> PASS ******************** 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> 230 Logged on 
(000131)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> disconnected. 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> SYST 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> 215 UNIX emulated by FileZilla 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> FEAT 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> 211-Features: 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> MDTM 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> REST STREAM 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> SIZE 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> MODE Z 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> MLST type*;size*;modify*; 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> MLSD 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> AUTH SSL 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> AUTH TLS 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> PROT 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> PBSZ 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> UTF8 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> CLNT 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> MFMT 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> EPSV 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> EPRT 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> 211 End 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> PBSZ 0 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> 200 PBSZ=0 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> PROT P 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> 200 Protection level set to P 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> PWD 
(000132)18/10/2016 15:44:19 - USER_NAME (IP_ADDRESS)> 257 "/" is current directory. 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> TYPE I 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> 200 Type set to I 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> PASV 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> 227 Entering Passive Mode (xxx,xxx,xxx,xxx,xxx,xxx) 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> MLSD 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> 150 Opening data channel for directory listing of "/" 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> SSL connection for data connection established 
(000132)18/10/2016 15:44:22 - USER_NAME (IP_ADDRESS)> 226 Successfully transferred "/" 
+0

Я просто заметил другую ошибку дается на Windows, >>> о.retbinary ('MLSD', open ('OUTTEST', 'wb'). write) Traceback (последний последний звонок): Файл «», строка 1, в Файл «C: \ Program Files \ Python \ lib \ ftplib.py ", строка 449, в retrbinary conn.unwrap() Файл« C: \ Program Files \ Python \ lib \ ssl.py », строка 788, в развертке s = self._sslobj.shutdown () OSError: [Errno 0] Ошибка Это привело меня сюда http://stackoverflow.com/questions/32913943/error-0-when-using-ftplib, где пользователь dtf замечает, что проблема с совместимостью с PureFTP. Я сейчас изучаю это. – admin0389

+0

Хорошо, я уверен, что это связано с повторным использованием сеанса SSL. К сожалению, ftplib не поддерживает эту функцию (и это действительно так) В качестве теста я попытался подключиться к моему домашнему серверу FileZilla, и он отлично работает, но когда я выбираю «Требовать возобновление сеанса TLS при подключении к данным при использовании PROT P «в разделе« Настройки FTP через TLS »в настройках сервера FileZilla, я получаю такую ​​же ошибку, как при попытке подключиться к серверу GoDaddy. – admin0389

ответ

0

Я думаю, вам нужно установить режим FTP к пассивному, вот similar error but in Perl

Разница объясняется в what-is-the-difference-between-active-and-passive-ftp

+0

Я считаю, что пассивный режим включен (вы можете увидеть его в журнале сервера FileZilla). Несмотря на это, я добавил строку o.set_pasv (true) после начальной строки подключения, и она не показала никакого эффекта. – admin0389

0

Как я пришел, чтобы узнать, эта проблема происходит потому, что GoDaddy FTP сервер настаивает на возобновлении сеанса FTP. Это настоящая боль, но я могу простить их, потому что это необходимая функция безопасности.

На данный момент Python3 не поддерживает возобновление сеанса SSL из коробки (хотя вы заметите, что SSLContext добавлен с 2.7, поэтому я думаю, что он наступит. https://docs.python.org/3/library/ssl.html#ssl.SSLContext).

Существует ошибка нить об этой проблеме здесь: https://bugs.python.org/issue19500

+0

Извините, просто хотел добавить, что, прочитав вышеприведенную страницу, был разработан патч и должен присутствовать в Python 3.6. – admin0389