仅当连接到 GoDaddy 托管服务器时,ftplib 出现 EOF 错误
Posted
技术标签:
【中文标题】仅当连接到 GoDaddy 托管服务器时,ftplib 出现 EOF 错误【英文标题】:EOF Error with ftplib only when connecting to GoDaddy hosted server 【发布时间】:2017-02-27 23:03:58 【问题描述】:我在 Python 2.7.3 中遇到 FTP_TLS (ftplib) 问题。
调查结果摘要(通过互联网执行的所有连接尝试):
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 有什么不同。所有尝试都是通过 Internet 执行的这一事实让我确信它与防火墙无关。此外,FileZilla 有效,所以从技术角度来看,连接是可能的,我只是很难用 Python 实现它。
如果我不发出 prot_p 开关,我的代码可以与 GoDaddy FTP 一起使用。
附加信息:
GoDaddy 不提供技术 FTP 日志(仅提供使用日志) 我的代码已经完美运行了一年多,这只是两个月前才开始发生的。 GoDaddy FTP 服务器标识为“Pure-FTPd [privsep] [TLS]”运行我的代码后的典型 FileZilla 服务器日志。
(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 (Tim.Kosse@gmx.de)
(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 "/"
【问题讨论】:
我刚刚注意到 Windows 上出现了一个不同的错误 >>> o.retrbinary('MLSD', open('OUTTEST', 'wb').write) Traceback(最近一次调用最后一次):文件“我发现,这个问题的发生是因为 GoDaddy FTP 服务器坚持 FTP 会话恢复。这是一个真正的痛苦,但我可以原谅他们,因为这是一个必要的安全功能。
目前,Python3 不支持开箱即用的 SSL 会话恢复(尽管您会注意到自 2.7 以来已添加 SSLContext,所以我认为它会出现。https://docs.python.org/3/library/ssl.html#ssl.SSLContext)。
这里有一个关于这个问题的错误线程:https://bugs.python.org/issue19500
【讨论】:
抱歉,只是想补充一点,通过阅读上面的页面,已经开发了一个补丁,应该存在于 Python 3.6 中。【参考方案2】:我认为您需要将 FTP 模式设置为被动,这里是 similar error but in Perl
区别在what-is-the-difference-between-active-and-passive-ftp中解释
【讨论】:
我相信被动模式已开启,(您可以在 FileZilla 服务器日志中看到它)。无论如何,我在初始连接行之后添加了 o.set_pasv(true) 行,它似乎没有任何效果。以上是关于仅当连接到 GoDaddy 托管服务器时,ftplib 出现 EOF 错误的主要内容,如果未能解决你的问题,请参考以下文章
当连接到用 PHP 实现的 Telnet/sockets 服务器时,PuTTY 显示奇怪的字符
当连接到不同的应用程序/设备时,我可以控制 chromecast 的音量吗?
将 GoDaddy 托管 Wordpress 与 Elementor 一起使用时,HTML 小部件无法正确呈现
DomPDF 在 localhost 中的行为与 GoDaddy 托管不同
C# 使用 HTTPS 从 URL 读取 XML 文件。 (使用 godaddy 托管)(来自 ZerosSSL 的证书)