我在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.'
任何想法可能出错?
答案 0 :(得分: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.
我的结论是,您的客户端脚本不是原因,因为它可以在我的计算机上运行,但服务器FTPD或其间的网络问题(代理?)。但我不喜欢125 Data connection already open
编辑:
我在Python 3.4下的工作方式相同,但需要以二进制模式打开本地文件:
with open(filename, 'rb') as fd:
ftps.storlines("STOR foo.txt", fd)
相同的输出......