Twisted FTP FileList协议和带空格的文件名

时间:2008-11-20 02:16:38

标签: python ftp twisted

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

FTPClient 上连接并调用列表方法时,生成的 FTPFileListProtocol 文件集合会执行此操作不包含任何包含空格('')的目录或文件名。

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

2 个答案:

答案 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中定义的MLSTMLSD

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可能是您最好的选择。

关于问题的结论,有三个可能的原因:

  1. 返回结果的处理不正确(扭曲可能是错误的,正如您所建议的那样,或者可能是其他地方)
  2. 服务器出错并且没有发送正确(完整)的响应
  3. 正在发送错误的命令(不太可能是直接NLST / LIST,但是如果为这些命令提供了参数,则某些服务器会有不同的反应。)
  4. 你可以消除(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跟踪器中打开一个错误。