Скрученный FTPFileListProtocol и имена файлов с пробелами

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

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

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


person Ryan Duffield    schedule 20.11.2008    source источник


Ответы (2)


Во-первых, если вы выполняете автоматизированные задачи в полученном списке 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.

В документации Twisted для 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 удобен тем, что он выполнит для вас анализ на уровне протокола.

Удачи.

person Martin Carpenter    schedule 22.11.2008
comment
Я даю вам принятый ответ, в основном потому, что вы правы в том, что мне, вероятно, следует использовать NLST вместо LIST. Спасибо. - person Ryan Duffield; 20.01.2009

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

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

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

person Thomas Hervé    schedule 25.11.2008