Python 3.8.5 соединение FTPS

Я пытаюсь установить соединение FTPS (или FTP) с FTP-сервером. Это делается на Python 3.8.5 32 бит через Visual Studio Code.

Вот код:

import ftplib
session = ftplib.FTP_TLS('server address')
#session.connect ('server address', 991)
session.login(user='username',passwd='password')
#session.prot_p()
session.set_pasv(True)
session.cwd("files")
print(session.pwd())
filename = "ftpTest.txt"
my_file = open('filepath\\ftpTest.txt', 'wb') # Open a local file to store the downloaded file
session.retrbinary('RETR ' + filename, my_file.write, 1024)

session.quit()

Я могу получить session.pwd (который отображает / files), но время ожидания соединения в строке 11 (session.retrbinary) составляет примерно 22 секунды со следующей ошибкой:

Exception has occurred: TimeoutError
[WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Я попытался установить для session.set_pasv значение True и False после истечения времени ожидания ftplib Python. Значение True вызывает ошибку TimeoutError, а значение False вызывает следующую ошибку в строке 11:

Exception has occurred: error_perm
500 Illegal PORT command

а также попытался установить другой порт (991) после истечения времени ожидания FTP-соединения Python SSL и это вызвало ошибку тайм-аута в строке 3.

При использовании FTP без TLS в строке 4 (session.login) возникла следующая ошибка:

Exception has occurred: error_perm
530 Non-anonymous sessions must use encryption.

Отключение брандмауэра McAfee LiveSafe тоже не помогло. Кстати передача файлов работает с Filezilla, можно было свободно передавать.


person xXIang    schedule 06.08.2020    source источник


Ответы (1)


Мне показалось, что установка безопасного соединения для передачи данных и изменение сеанса af на INET6 сработали. Это было предложено мне коллегой, и я не понимаю, почему это работает. Если кто-нибудь может дать правильное объяснение, пожалуйста.

Код:

session.login(user='username',passwd='password')
session.prot_p()
session.af = socket.AF_INET6
person xXIang    schedule 12.08.2020
comment
Возможное объяснение заключается в том, что с IPv4 сервер отправляет свой IP-адрес в ответ на команду PASV. Если сервер или сеть не настроены должным образом, предоставленный IP-адрес может быть недоступен для маршрутизации с клиентского компьютера. Итак, передача файла не удалась. При использовании IPv6 сервер не отправляет свой IP-адрес в ответ на команду EPSV, а клиент использует исходный IP-адрес сервера. См. Также Невозможно отобразить каталог FTP с помощью ftplib, но клиент FTP работает. - person Martin Prikryl; 16.08.2020