2

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

在FTPClient上连接和调用list方法时,生成的FTPFileListProtocol文件集合不包含任何包含空格 (' ') 的目录或文件名。

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

4

2 回答 2

2

首先,如果您在检索的 FTP 列表上执行自动化任务,那么您可能应该查看NLST而不是RFC 959 第 4.1.3 节LIST中所述:

名单 (NLST)
 ...
            此命令旨在返回信息
            程序可以使用它来进一步处理
            文件自动。

Twisted文档LIST说:

它可以处理最常见的文件列表格式。

这让我很怀疑;我不喜欢“应付”的解决方案。LIST旨在供人类消费而非机器处理。

如果您的目标服务器支持它们,那么您应该更喜欢MLSTMLSD按照RFC 3659 第 7 节中的定义:

7. 机器处理清单(MLST 和 MLSD)

   MLST 和 MLSD 命令旨在标准化文件和
   server-FTP进程返回的目录信息。这些
   命令与 LIST 命令的不同之处在于
   回复虽然可以扩展,但被严格定义。

但是,这些较新的命令可能在您的目标服务器上不可用,而且我在 Twisted 中看不到它们。因此NLST可能是您最好的选择。

至于问题的关键,可能有三个原因:

  1. 返回结果的处理不正确(Twisted 可能有问题,正如您所建议的那样,或者可能是其他地方)
  2. 服务器有问题,没有发送正确(完整)的响应
  3. 正在发送错误的命令(不太可能使用直接NLST/ LIST,但如果为这些命令提供参数,某些服务器会做出不同的反应)

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

祝你好运。

于 2008-11-22T11:33:06.613 回答
0

这在某种程度上是意料之中的。FTPFileListProtocol 不能理解每一个 FTP 输出,因为,有些是古怪的。如文档字符串中所述:

如果你对古怪的 FTP 服务器需要不同的邪恶,你可以覆盖 C{fileLinePattern} 或 C{parseDirectoryLine()}。

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

于 2008-11-25T09:26:35.777 回答