【问题标题】:Twisted FTPFileListProtocol and file names with spaces扭曲的 FTPFileListProtocol 和带空格的文件名
【发布时间】:2008-11-20 02:16:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: python ftp twisted


    【解决方案1】:

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

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

    Twisted documentationLIST 表示:

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

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

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

    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 很好,因为它会为您执行协议级别的分析。

    祝你好运。

    【讨论】:

    • 我正在给你接受的答案,主要是因为你是正确的,我可能应该使用 NLST 而不是 LIST。谢谢。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 2010-12-07
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多