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

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
804
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

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

Удачи.

Я даю вам принятый ответ, в основном потому, что вы правы в том, что мне, вероятно, следует использовать NLST вместо LIST. Спасибо.

Ryan Duffield 20.01.2009 16:56

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

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

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

Другие вопросы по теме