【发布时间】: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(最近一次调用最后一次):文件“
”,第 1 行,在 文件“C:\Program Files\Python\lib\ftplib.py”,第 449 行,在 retrbinary conn.unwrap() 文件“C:\Program Files\Python \lib\ssl.py",第 788 行,在 unwrap s = self._sslobj.shutdown() OSError: [Errno 0] Error 这导致我到这里 stackoverflow.com/questions/32913943/error-0-when-using-ftplib 用户 dtf cmets 存在与 PureFTP 的兼容性问题。我现在正在研究这个。 -
好的,我很确定这与 SSL 会话重用有关。不幸的是,ftplib 不支持此功能(它确实应该)作为测试,我尝试连接到我的家庭 FileZilla 服务器并且它工作正常,但是当我在“使用 PROT P 时选择数据连接时需要 TLS 会话恢复”时FileZilla 服务器设置中的 FTP over TLS 设置”,我收到与尝试连接到 GoDaddy 服务器时相同的错误。
标签: python python-2.7 ftplib