我正在使用 Python 和Twisted框架连接到 FTP 站点以执行各种自动化任务。如果相关的话,我们的 FTP 服务器恰好是 Pure-FTPd。
在FTPClient上连接和调用list方法时,生成的FTPFileListProtocol的文件集合不包含任何包含空格 (' ') 的目录或文件名。
有没有其他人看过这个?是创建 FTPFileListProtocol 的子类并覆盖其unknownLine方法,手动解析文件/目录名称的唯一解决方案吗?
首先,如果您在检索的 FTP 列表上执行自动化任务,那么您可能应该查看NLST
而不是RFC 959 第 4.1.3 节LIST
中所述:
名单 (NLST) ... 此命令旨在返回信息 程序可以使用它来进一步处理 文件自动。
Twisted文档LIST
说:
它可以处理最常见的文件列表格式。
这让我很怀疑;我不喜欢“应付”的解决方案。LIST
旨在供人类消费而非机器处理。
如果您的目标服务器支持它们,那么您应该更喜欢MLST
并MLSD
按照RFC 3659 第 7 节中的定义:
7. 机器处理清单(MLST 和 MLSD) MLST 和 MLSD 命令旨在标准化文件和 server-FTP进程返回的目录信息。这些 命令与 LIST 命令的不同之处在于 回复虽然可以扩展,但被严格定义。
但是,这些较新的命令可能在您的目标服务器上不可用,而且我在 Twisted 中看不到它们。因此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 跟踪器中打开一个错误。