我使用Python和Twisted框架连接到FTP站点以执行各种自动化任务。我们的FTP服务器恰好是Pure-FTPd,如果这是相关的。Twisted FTPFileListProtocol和带空格的文件名
当连接并呼吁一个FTPClient,所产生的FTPFileListProtocol的文件集合不包含任何目录或包含空格的文件名('“)的列表方法。
有没有其他人看到过这个?是唯一的解决方案来创建一个FTPFileListProtocol子类并覆盖它的方法,手动解析文件/目录名称?
我使用Python和Twisted框架连接到FTP站点以执行各种自动化任务。我们的FTP服务器恰好是Pure-FTPd,如果这是相关的。Twisted FTPFileListProtocol和带空格的文件名
当连接并呼吁一个FTPClient,所产生的FTPFileListProtocol的文件集合不包含任何目录或包含空格的文件名('“)的列表方法。
有没有其他人看到过这个?是唯一的解决方案来创建一个FTPFileListProtocol子类并覆盖它的方法,手动解析文件/目录名称?
首先,如果你在一个retrieived FTP进行自动化的任务列表,那么你或许应该寻找NLST
,而不是作为LIST
注意到RFC 959 section 4.1.3:
NAME LIST (NLST) ... This command is intended to return information that can be used by a program to further process the files automatically.
的Twisted documentation为LIST
说:
It can cope with most common file listing formats.
这让我很怀疑;我不喜欢“应对”的解决方案。 LIST
用于人类消费而非机器加工。
如果目标服务器支持他们,那么你应该更喜欢MLST
和MLSD
为RFC 3659 section 7定义:
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.
然而,这些新指令可能无法使用在目标服务器上,我不认为他们会在扭曲。因此NLST
可能是你最好的选择。
至于你的问题的要点,有三种可能的原因:
NLST
/LIST
,但有些服务器有不同的反应,如果参数提供给这些命令)您可以通过查看通过电线发送的内容来消除(2)和(3)并证明原因是(1)。如果这个选项不可用作Twisted API或Pure-FTPD服务器日志配置的一部分,那么您可能需要打开一个网络嗅探器,例如tcpdump,snoop或WireShark(假设您允许在你的环境)。请注意,您不仅需要跟踪控制连接(端口21),还需要跟踪数据连接(因为它包含LIST
/NLST
命令的结果)。 WireShark非常好,因为它会为您执行协议级分析。
祝你好运。
这是预料之中的。FTPFileListProtocol不能理解每个FTP输出,因为有些是古怪的。正如在文档字符串中所解释的:
如果您需要针对古怪的FTP服务器使用不同的恶意软件,则可以使用 覆盖C {fileLinePattern}或C {parseDirectoryLine()}。
在这种情况下,它可能是一个错误:也许你可以改进fileLinePattern并使它理解文件名和空格。如果是这样,欢迎您在Twisted跟踪器中打开一个错误。
我给你接受的答案,主要是因为你是正确的,我应该使用NLST而不是LIST。谢谢。 – 2009-01-20 13:56:52