我正在尝试与 FTP 服务器建立 FTPS(或 FTP)连接。这是通过 Visual Studio Code 在 Python 3.8.5 32 位上完成的。
这是代码:
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),但在大约 22 秒内第 11 行(session.retrbinary)连接超时,并出现以下错误:
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
我曾尝试在 Python ftplib 超时之后将 session.set_pasv 设置为 True 和 False。将其设置为 True 会引发 TimeoutError,将其设置为 False 会在第 11 行引发以下错误:
Exception has occurred: error_perm
500 Illegal PORT command
还尝试在 Python SSL FTP 连接超时后设置不同的端口 (991),并在第 3 行引发超时错误。
使用不带 TLS 的 FTP 在第 4 行 (session.login) 引发以下错误:
Exception has occurred: error_perm
530 Non-anonymous sessions must use encryption.
关闭我的 McAfee LiveSafe 防火墙也没有帮助。 顺便说一下文件传输与Filezilla配合使用,可以自由传输。
设置安全数据连接并将会话 af 更改为 INET6 似乎对我有用。这是一位同事向我建议的,至于为什么它有效,我无法理解。如果有人可以提供正确的解释,请这样做。
代码:
session.login(user='username',passwd='password')
session.prot_p()
session.af = socket.AF_INET6