Python ftp 储存冻结
我在用Python写一个脚本,想把一些文件上传到支持TLS的FTP服务器上,但遇到了一些问题。我用的代码是:
ftps = FTP_TLS(FTP_SERVER)
ftps.set_debuglevel(2)
ftps.login(FTP_USER,FTP_PASSWORD)
ftps.prot_p()
ftps.cwd(DIR)
ftps.storlines("STOR " + filename, open(file))
在这个时候,脚本似乎卡住了。如果我用FileZilla登录到FTP服务器,就能看到文件已经创建了,但文件大小是0KB。我不得不按Ctrl+C来取消脚本,然后在FileZilla中文件的大小才显示正确。如果我让脚本继续运行,文件在FTP服务器上会被删除。
调试输出是这样的:
*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH command ok. Expecting TLS Negotiation.\r\n'
*resp* '234 AUTH command ok. Expecting TLS Negotiation.'
*cmd* 'USER XXXXXXXXX'
*put* 'USER XXXXXXXXX\r\n'
*get* '331 Password required\r\n'
*resp* '331 Password required'
*cmd* 'PASS **************'
*put* 'PASS **************\r\n'
*get* '230-congrats\r\n'
*get* '230 User logged in.\r\n'
*resp* '230-congrats\n230 User logged in.'
*cmd* 'PBSZ 0'
*put* 'PBSZ 0\r\n'
*get* '200 PBSZ command successful.\r\n'
*resp* '200 PBSZ command successful.'
*cmd* 'PROT P'
*put* 'PROT P\r\n'
*get* '200 PROT command successful.\r\n'
*resp* '200 PROT command successful.'
*cmd* 'CWD XXXXXXXXX'
*put* 'CWD XXXXXXXXX\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\r\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (XXXXXXXXXXXXXX).\r\n'
*resp* '227 Entering Passive Mode (XXXXXXXXXXXX).'
*cmd* 'STOR file.txt'
*put* 'STOR file.txt\r\n'
*get* '125 Data connection already open; Transfer starting.\r\n'
*resp* '125 Data connection already open; Transfer starting.'
^C
*cmd* 'QUIT'
*put* 'QUIT\r\n'
*get* '226 Transfer complete.\r\n'
*resp* '226 Transfer complete.'
脚本在这个地方卡住了:
*resp* '125 Data connection already open; Transfer starting.'
有没有人知道可能出什么问题了?
1 个回答
0
我可以设置一个TLS服务器,并且用完全相同的命令在Python 2.7上运行。
一切都很顺利。不过我得到的结果稍微有点不同,因为我觉得我用的服务器和你不一样。在storelines
这个命令上,情况开始变得真的不一样了(我使用with
来确保文件会被关闭):
with open(filename) as fd:
ftps.storlines("STOR foo.txt", fd)
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\r\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (192,168,56,48,227,80)\r\n'
*resp* '227 Entering Passive Mode (192,168,56,48,227,80)'
*cmd* 'STOR foo.txt'
*put* 'STOR foo.txt\r\n'
*get* "150 Opening ASCII mode SSL data connection for 'foo.txt'.\r\n"
*resp* "150 Opening ASCII mode SSL data connection for 'foo.txt'."
*get* '226 Transfer complete.\r\n'
*resp* '226 Transfer complete.'
'226 Transfer complete.'
主要的区别是,我收到的是150 Opening ASCII mode SSL data connection
,而你收到的是125 Data connection already open; Transfer starting.
我的结论是,你的客户端脚本不是问题所在,因为它在我的电脑上能正常工作,可能是服务器的FTP服务有问题,或者是网络中间有问题(比如代理?)。不过我对125 Data connection already open
这个结果不太满意。
编辑:
在Python 3.4下也是一样的情况,但需要以二进制模式打开本地文件:
with open(filename, 'rb') as fd:
ftps.storlines("STOR foo.txt", fd)
输出是一样的……