2008-11-20 2 views
2

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

При подключении и вызов списка метода на FTPClient, полученный FTPFileListProtocol «s файлов коллекции не содержат какие-либо каталогов или имена файлов, которые содержат пробел (» «).

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

ответ

2

Во-первых, если вы выполняете автоматизированные задачи на retrieived FTP листинг, то вы, вероятно, следует искать в NLST, а не LIST, как указано в RFC 959 section 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 documentation для 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. 

Однако эти новые команды могут быть недоступны на вашем целевом сервере, и я не вижу их в Витая. Поэтому, вероятно, ваш лучший выбор - NLST.

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

  1. Обработка возвращенных результатов неверен (Twisted может быть виноват, как вы предлагаете, или, возможно, в другом месте)
  2. сервер глючит и не посылает правильный (полный) ответ
  3. неправильная команда посылается (вряд ли с прямым NLST/LIST, но некоторые сервера реагируют по-разному, если аргументы поставляются в эти команды)

Вы можете устранить (2) и (3) и доказать, что причиной является (1), глядя на то, что отправлено по проводу. Если эта опция недоступна для вас как часть API Twisted API или конфигурации журнала Pure-FTPD, вам может понадобиться разбить сетевой сниффер, такой как tcpdump, snoop или WireShark (при условии, что вам разрешено делать это в вашей среды). Обратите внимание, что вам нужно будет отслеживать не только управляющее соединение (порт 21), но также соединение с данными (так как это приводит к выполнению команды LIST/NLST). WireShark хорош, так как он будет выполнять анализ уровня протокола для вас.

Удачи.

+0

Я даю вам принятый ответ, главным образом потому, что вы правы, что я, вероятно, должен использовать NLST вместо LIST. Благодарю. – 2009-01-20 13:56:52

0

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

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

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

Смежные вопросы