Я использую Python и структуру Скрученный для подключения к FTP-сайту для выполнения различных автоматизированных задач. Наш FTP-сервер - это Pure-FTPd, если это уместно.
При подключении и вызове метода список для FTPClient результирующая коллекция файлыFTPFileListProtocol не содержит каталогов или имен файлов, содержащих пробел ('').
Кто-нибудь еще видел это? Единственное решение - создать подкласс FTPFileListProtocol и переопределить его метод unknownLine, анализируя имена файлов / каталогов вручную?






Во-первых, если вы выполняете автоматические задачи с полученным листингом 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, вероятно, ваш лучший выбор.
Что касается сути вашей проблемы, то есть три вероятных причины:
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.
Я даю вам принятый ответ, в основном потому, что вы правы в том, что мне, вероятно, следует использовать NLST вместо LIST. Спасибо.