使用Python连接Azure App Service FTPS下载文件失败如何解决?
问题解决说明
核心错误原因
你目前使用的ftplib.FTP是针对明文FTP协议的类,而Azure App Service提供的是FTPS(FTP over TLS/SSL)加密协议,二者不兼容,这是你连接报错的根本原因。
host参数正确配置+正确连接步骤
要连接Azure App Service的FTPS服务,需要使用ftplib.FTP_TLS类,参数配置规则如下:
- host参数填写部署中心FTPS端点去掉
ftps://前缀后的内容,不要带http:///https:///ftps://等协议头,也不要带路径后缀 - 端口990不要直接传入构造函数(FTP_TLS构造函数第二个参数是用户名,不是端口),需要通过
connect方法单独指定 - 连接完成后必须调用
prot_p()方法开启数据传输通道加密,否则Azure会拒绝后续文件操作请求
正确代码示例:
from ftplib import FTP_TLS # 初始化FTPS对象 ftp = FTP_TLS() # 连接服务,替换为你自己的FTPS域名(去掉ftps://前缀)和端口 ftp.connect(host='你的部署中心FTPS域名', port=990) # 登录,替换为部署中心提供的FTPS用户名和密码 ftp.login(user='你的FTPS用户名', passwd='你的FTPS密码') # 开启数据通道加密 ftp.prot_p() # 后续可执行下载、列目录等操作,示例:列出当前目录文件 print(ftp.dir()) # 操作完成后关闭连接 ftp.quit()
过往报错原因说明
socket.gaierror: [Errno 11001] getaddrinfo failed:是因为传入的host参数带了协议前缀,域名解析时无法识别带https:///ftps://的字符串为有效域名,导致解析失败TimeoutError: [WinError 10060]:是因为用明文FTP类访问FTPS专属的990端口,服务端不会响应未加密的FTP连接请求,所以超时。如果直接填写App Service的公网IP也会超时,因为Azure的FTPS服务是绑定在专属FTP域名上的,没有直接绑定到应用的虚拟IP。
替代解决方案
如果FTPS配置遇到问题,也可以在Azure App Service部署中心开启SFTP功能,使用paramiko库的SFTP客户端连接,连接逻辑更简单,加密稳定性也更好。
内容的提问来源于stack exchange,提问作者Kahalon
相关产品推荐
相关产品推荐

