Twisted FTPFileListProtocol和带空格的文件名

2024-05-19 03:40:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

其他人见过这个吗?是创建FTPFileListProtocol的子类并重写其unknownLine方法并手动解析文件/目录名的唯一解决方案吗?在


Tags: 文件方法服务器目录框架客户机站点文件名
2条回答

这是意料之中的。FTPFileListProtocol不能理解每一个FTP输出,因为,好吧,有些是古怪的。如docstring中所述:

如果你需要一个古怪的FTP服务器不同的邪恶,你可以 重写C{fileLinePattern}或C{parseDirectoryLine()}。在

在本例中,这可能是一个bug:也许您可以改进fileLinePattern,使它理解带有空格的文件名。如果是这样的话,欢迎在Twisted tracker中打开一个bug。在

首先,如果您在检索到的FTP列表上执行自动任务,那么您可能应该查看NLST,而不是{},如{a1}所述:

 NAME LIST (NLST)
 ...
            This command is intended to return information that
            can be used by a program to further process the
            files automatically.

LISTTwisted documentation表示:

^{pr2}$

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

如果目标服务器支持它们,那么您应该选择MLST和{},如{a3}中所定义:

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. 对返回结果的处理不正确(如您所说,Twisted可能是错误的,或者可能在其他地方)
  2. 服务器有缺陷,没有发送正确(完整)的响应
  3. 发送错误的命令(不太可能是直接的NLST/LIST,但是如果向这些命令提供参数,则某些服务器的反应会有所不同)

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

祝你好运。在

相关问题 更多 >

    热门问题