Una descarga FTP a través de SOCKS con PycURL
Deje que libcurl gestione las conexiones de control y de datos pasivos de una descarga FTP a través de un proxy SOCKS5.
PycURL expone la compatibilidad de libcurl con FTP y SOCKS mediante un único identificador de transferencia. En una descarga FTP pasiva, la aplicación puede dejar tanto la conexión de control como la conexión de datos independiente a esa implementación.
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 es la URL del recurso FTP de la aplicación, y output es un flujo de salida binario ya abierto. Los tiempos de espera son límites de ejemplo que deben elegirse según el tamaño de archivo y la conexión previstos. Para un recurso FTP público en el que se permiten intermediarios públicos, la lista de proxies SOCKS5 ofrece candidatos para la URL del proxy; compruebe que el nodo elegido permita tanto el destino de control como el de datos pasivos.
socks5h delega la resolución del nombre de host de destino al proxy SOCKS. NOPROXY está explícitamente vacío para que un ajuste de entorno no_proxy heredado no eluda la ruta de esta transferencia.
Deje el FTP activo desactivado: espera una conexión entrante del servidor y no está disponible con este modo de proxy. La política de salida del proxy debe permitir el puerto de control FTP y el puerto de datos pasivos elegido para la transferencia. Por tanto, un inicio de sesión correcto por sí solo no demuestra que el archivo pueda descargarse.
Cuando se requiera autenticación, use PROXYUSERNAME y PROXYPASSWORD de PycURL para el intermediario; las credenciales del servidor FTP pertenecen a la conexión FTP.