【发布时间】:2024-01-16 17:48:01
【问题描述】:
我在使用 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.'
有什么想法可能是错的吗?
【问题讨论】:
-
会不会是被动配置的问题?也许您可以在调用
storlines之前尝试使用ftps.set_pasv(False)进行配置 -
如果我将 pasv 设置为 False,我会收到错误消息:ftplib.error_perm: 501 Server cannot accept argument.
-
只是为了确保输入文件没有问题,你可以试试:
import io txtfile = io.StringIO(u"abc\ndefgh\nijkl\n")然后ftps.storlines("STOR " + filename, txtfile) -
同样的结果,挂在这里:*get* '125 数据连接已经打开;传输开始。\r\n' resp '125 数据连接已打开;转移开始。
-
你控制 ftpserver 和它的网络吗?它是什么服务器?