Twisted FTP FileList Protocol и имена файлов с пробелами

StackOverflow https://stackoverflow.com/questions/304152

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Витая документация для < code> LIST говорит:

It can cope with most common file listing formats.

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

Если ваш целевой сервер поддерживает их, вам следует предпочесть MLST и MLSD , как определено в RFC 3659 section 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 , вероятно, является лучшим выбором.

Что касается сути вашей проблемы, есть три вероятных причины:

<Ол>
  • Неправильная обработка возвращаемых результатов (возможно, ошибка Twisted, как вы предлагаете, или, возможно, в другом месте)
  • Сервер глючит и не отправляет правильный (полный) ответ
  • Отправляется неправильная команда (маловероятно для прямой 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.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top