我使用Python和Twisted框架连接到FTP站点以执行各种自动化任务。我们的FTP服务器恰好是Pure-FTPd,如果这是相关的。
在 FTPClient 上连接并调用列表方法时,生成的 FTPFileListProtocol 的文件集合会执行此操作不包含任何包含空格('')的目录或文件名。
有没有人见过这个?是创建FTPFileListProtocol子类并覆盖其 unknownLine 方法,手动解析文件/目录名称的唯一解决方案吗?
答案 0 :(得分:2)
首先,如果您在检索到的FTP列表上执行自动化任务,那么您应该按RFC 959 section 4.1.3中所述NLST
而不是LIST
来查看:
NAME LIST (NLST) ... This command is intended to return information that can be used by a program to further process the files automatically.
LIST
的{{3}}说:
It can cope with most common file listing formats.
这让我怀疑;我不喜欢“应对”的解决方案。 LIST
用于人类消费而非机器处理。
如果您的目标服务器支持它们,那么您应该更喜欢Twisted documentation中定义的MLST
和MLSD
:
7. Listings for Machine Processing (MLST and MLSD) The MLST and MLSD commands are intended to standardize the file and directory information returned by the server-FTP process. These commands differ from the LIST command in that the format of the replies is strictly defined although extensible.
但是,这些较新的命令可能在目标服务器上不可用,我在Twisted中看不到它们。因此,NLST
可能是您最好的选择。
关于问题的结论,有三个可能的原因:
NLST
/ LIST
,但是如果为这些命令提供了参数,则某些服务器会有不同的反应。)你可以消除(2)和(3)并通过查看通过线路发送的内容来证明原因是(1)。如果您无法使用此选项作为Twisted API或Pure-FTPD服务器日志记录配置的一部分,那么您可能需要打破网络嗅探器,例如tcpdump,snoop或WireShark(假设您允许执行此操作)你的环境)。请注意,您不仅需要跟踪控制连接(端口21),还需要跟踪数据连接(因为它带有LIST
/ NLST
命令的结果)。 WireShark非常好,因为它将为您执行协议级分析。
答案 1 :(得分:0)
这是某种程度的预期。 FTPFileListProtocol无法理解每个FTP输出,因为有些是古怪的。正如文档字符串中所解释的那样:
如果你需要一个古怪的FTP服务器的不同邪恶,你可以 覆盖C {fileLinePattern}或C {parseDirectoryLine()}。
在这种情况下,它可能是一个错误:也许您可以改进fileLinePattern并使其理解带有空格的文件名。如果是这样,欢迎您在Twisted跟踪器中打开一个错误。