Python ftplib таймаут

Я пытаюсь использовать ftplib, чтобы получить список файлов и загрузить любые новые файлы начиная с моей последней проверки. Код, который я пытаюсь выполнить до сих пор:

#!/usr/bin/env python
from ftplib import FTP
import sys

host = 'ftp.***.com'
user = '***'
passwd = '***'

try:
    ftp = FTP(host)
    ftp.login(user, passwd)
except:
    print 'Error connecting to FTP server'
    sys.exit()

try:
    ftp.retrlines('LIST')
except:
    print 'Error fetching file listing'
    ftp.quit()
    sys.exit()

ftp.quit() 

Каждый раз, когда я выполняю это, это испытывает таймаут, когда я пытаюсь получить список. Какие-либо идеи?

10
задан blcArmadillo 10 August 2010 в 17:43
поделиться

1 ответ

Скорее всего, конфликт между активным и пассивным режимом. Убедитесь, что верно одно из следующих условий:

  1. Сервер поддерживает режим PASV, а ваш клиент устанавливает режим PASV
  2. Если сервер не поддерживает пассивный режим, то ваш брандмауэр должен поддерживать FTP-передачи в активном режиме.

EDIT: Я просмотрел документацию и обнаружил, что в Python 2.1 и более поздних версиях по умолчанию используется пассивный режим. С каким сервером вы разговариваете, и знаете ли вы, поддерживает ли он пассивный режим?

В активном режиме (не PASV) клиент посылает команду PORT, указывающую серверу инициировать DATA-соединение на этом порту, что требует, чтобы ваш брандмауэр знал о команде PORT, чтобы он мог перенаправить входящее DATA-соединение к вам - немногие брандмауэры поддерживают это. В пассивном режиме клиент открывает DATA-соединение, а сервер использует его (сервер "пассивен" в открытии data-соединения).

На всякий случай, если вы не используете пассивный режим, сделайте ftp.set_pasv(True) и посмотрите, есть ли разница.

12
ответ дан 3 December 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: