Невозможно отобразить каталог FTP с помощью ftplib - но FTP-клиент работает - PullRequest
3 голосов
/ 23 апреля 2019

Я пытаюсь подключиться к FTP, но не могу выполнить какие-либо команды.

ftp_server = ip
ftp_username = username
ftp_password = password

ftp = ftplib.FTP(ftp_server)
ftp.login(ftp_username, ftp_password)
'230 Logged on'

ftp.nlst()

ftp.nlst выдает эту ошибку:

Ошибка:
[WinError 10060] Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный промежуток времени, или не удалось установить соединение, так как подключенный хост не смог ответить


Я протестировал соединение с помощью FileZilla (работает на той же машине), и оно отлично работает.

Это журнал FileZilla:

Status: Connection established, waiting for welcome message...
Status: Insecure server, it does not support FTP over TLS.
Status: Logged in Status: Retrieving directory listing...
Status: Server sent passive reply with unroutable address. Using server address instead.
Status: Directory listing of "/" successful

1 Ответ

1 голос
/ 26 апреля 2019

Статус: сервер отправил пассивный ответ с не маршрутизируемым адресом

Вышеуказанное означает, что FTP-сервер настроен неправильно.Он отправляет свой внутренний сетевой IP-адрес во внешнюю сеть (клиенту - FileZilla или Python ftplib), где он недействителен.FileZilla может обнаружить это и автоматически использовать исходный IP-адрес сервера.

Python ftplib не выполняет такое обнаружение.

Вам необходимо исправить свой FTP-сервер, чтобы он возвращал правильныйIP-адрес.


Если невозможно починить сервер (он не ваш и администратор не сотрудничает), вы можете заставить ftplib игнорировать возвращенный (неверный) IP-адрес и использовать оригинальный адресвместо этого переопределяя FTP.makepasv:

class SmartFTP(FTP):
    def makepasv(self):
        invalidhost, port = super(SmartFTP, self).makepasv()
        return self.host, port

ftp = SmartFTP(ftp_server)

# the rest of the code is the same
...