Скрученный FTPFileListProtocol и имена файлов с пробелами - PullRequest
2 голосов
/ 20 ноября 2008

Я использую Python и инфраструктуру Twisted для подключения к FTP-сайту для выполнения различных автоматизированных задач. Наш FTP-сервер является Pure-FTPd, если это актуально.

При подключении и вызове метода list для FTPClient результирующая FTPFileListProtocol files коллекция не содержит каталогов или имена файлов, содержащие пробел ('').

Кто-нибудь еще видел это? Является ли единственным решением создать подкласс FTPFileListProtocol и переопределить его метод unknownLine , анализируя имена файлов и каталогов вручную?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2008

Во-первых, если вы выполняете автоматизированные задачи для полученного списка FTP, то вам, вероятно, следует смотреть NLST, а не LIST, как указано в RFC 959, раздел 4.1.3 :

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

Витая документация для LIST гласит:

It can cope with most common file listing formats.

Это делает меня подозрительным; Я не люблю решения, которые "справляются". LIST предназначался для потребления человеком, а не для машинной обработки.

Если ваш целевой сервер поддерживает их, вам следует предпочесть MLST и MLSD, как определено в RFC 3659, раздел 7 :

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 или конфигурации ведения журнала сервера Pure-FTPD, то вам может потребоваться отключить сетевой анализатор, такой как tcpdump, snoop или WireShark (при условии, что вам разрешено делать это в ваша среда). Обратите внимание, что вам нужно будет отслеживать не только управляющее соединение (порт 21), но и соединение для передачи данных (так как оно содержит результаты команды LIST / NLST). WireShark хорош, поскольку он выполнит анализ на уровне протокола для вас.

Удачи.

0 голосов
/ 25 ноября 2008

Это как-то ожидается. FTPFileListProtocol не может понять все выходные данные FTP, потому что, ну, некоторые из них дурацкие. Как объяснено в строке документации:

Если вам нужно другое зло для дурацкого FTP-сервера, вы можете переопределить C {fileLinePattern} или C {parseDirectoryLine ()}.

В этом случае это может быть ошибка: может быть, вы можете улучшить fileLinePattern и сделать так, чтобы он понимал имя файла с пробелами. Если это так, вы можете открыть ошибку в трекере Twisted.

...