2008-11-20 101 views
2

我使用Python和Twisted框架连接到FTP站点以执行各种自动化任务。我们的FTP服务器恰好是Pure-FTPd,如果这是相关的。Twisted FTPFileListProtocol和带空格的文件名

当连接并呼吁一个FTPClient,所产生的FTPFileListProtocol文件集合不包含任何目录或包含空格的文件名('“)的列表方法。

有没有其他人看到过这个?是唯一的解决方案来创建一个FTPFileListProtocol子类并覆盖它的方法,手动解析文件/目录名称?

回答

2

首先,如果你在一个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 documentationLIST说:

 
It can cope with most common file listing formats. 

这让我很怀疑;我不喜欢“应对”的解决方案。 LIST用于人类消费而非机器加工。

如果目标服务器支持他们,那么你应该更喜欢MLSTMLSDRFC 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可能是你最好的选择。

至于你的问题的要点,有三种可能的原因:

  1. 返回结果的处理是不正确的(扭转可能发生故障,你的建议,或者是其他地方)
  2. 该服务器是车,而不是发送一个正确的(完整的)响应
  3. 错误的命令正被发送(不太可能与直NLST/LIST,但有些服务器有不同的反应,如果参数提供给这些命令)

您可以通过查看通过电线发送的内容来消除(2)和(3)并证明原因是(1)。如果这个选项不可用作Twisted API或Pure-FTPD服务器日志配置的一部分,那么您可能需要打开一个网络嗅探器,例如tcpdump,snoop或WireShark(假设您允许在你的环境)。请注意,您不仅需要跟踪控制连接(端口21),还需要跟踪数据连接(因为它包含LIST/NLST命令的结果)。 WireShark非常好,因为它会为您执行协议级分析。

祝你好运。

+0

我给你接受的答案,主要是因为你是正确的,我应该使用NLST而不是LIST。谢谢。 – 2009-01-20 13:56:52

0

这是预料之中的。FTPFileListProtocol不能理解每个FTP输出,因为有些是古怪的。正如在文档字符串中所解释的:

如果您需要针对古怪的FTP服务器使用不同的恶意软件,则可以使用 覆盖C {fileLinePattern}或C {parseDirectoryLine()}。

在这种情况下,它可能是一个错误:也许你可以改进fileLinePattern并使它理解文件名和空格。如果是这样,欢迎您在Twisted跟踪器中打开一个错误。

相关问题