使用 PycURL 通过 SOCKS 下载 FTP
让 libcurl 通过 SOCKS5 代理处理 FTP 下载的控制连接与被动数据连接。
PycURL 通过一个传输句柄暴露 libcurl 的 FTP 与 SOCKS 支持。对于被动模式 FTP 下载,应用程序可以把控制连接和独立的数据连接都交给该实现处理。
import pycurl
transfer = pycurl.Curl()
try:
transfer.setopt(pycurl.URL, ftp_url)
transfer.setopt(pycurl.PROXY, "socks5h://proxy.example.net:1080")
transfer.setopt(pycurl.NOPROXY, "")
transfer.setopt(pycurl.WRITEDATA, output)
transfer.setopt(pycurl.CONNECTTIMEOUT, 10)
transfer.setopt(pycurl.TIMEOUT, 60)
transfer.perform()
finally:
transfer.close()
ftp_url 是应用程序的 FTP 资源 URL,output 是已经打开的二进制输出流。超时只是示例上限,应按预期的文件大小和连接情况选择。对于允许公共中介的公共 FTP 资源,SOCKS5 代理列表可提供代理 URL 的候选;请确认所选节点同时允许控制端口与被动数据端口。
socks5h 把目标主机名解析交给 SOCKS 代理完成。NOPROXY 被显式置空,以免继承的 no_proxy 环境设置绕过本次传输的线路。
保持主动模式 FTP 关闭:它需要服务器主动连入,在此代理模式下不可用。代理的出站策略必须允许 FTP 控制端口以及为传输选定的被动数据端口。因此,仅登录成功并不能证明文件可以下载。
需要认证时,对中介使用 PycURL 的 PROXYUSERNAME 与 PROXYPASSWORD;FTP 服务器的凭据属于 FTP 连接本身。