Un download FTP tramite SOCKS con PycURL
Lasciate che libcurl gestisca le connessioni di controllo e dati passivi di un download FTP attraverso un proxy SOCKS5.
PycURL espone il supporto FTP e SOCKS di libcurl tramite un unico handle di trasferimento. In un download FTP passivo, l'applicazione può lasciare sia la connessione di controllo sia la connessione dati separata a quell'implementazione.
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 è l'URL della risorsa FTP dell'applicazione, e output è un flusso di output binario già aperto. I timeout sono limiti di esempio da scegliere in base alla dimensione del file e alla connessione previste. Per una risorsa FTP pubblica in cui sono ammessi intermediari pubblici, la lista di proxy SOCKS5 offre candidati per l'URL del proxy; verificate che il nodo scelto consenta sia la destinazione di controllo sia quella dei dati passivi.
socks5h delega la risoluzione del nome host di destinazione al proxy SOCKS. NOPROXY è esplicitamente vuoto affinché un'impostazione d'ambiente no_proxy ereditata non aggiri il percorso per questo trasferimento.
Lasciate disattivato l'FTP attivo: attende una connessione in ingresso dal server e non è disponibile con questa modalità proxy. La politica in uscita del proxy deve consentire la porta di controllo FTP e la porta dati passiva scelta per il trasferimento. Un login riuscito, quindi, non basta a dimostrare che il file possa essere scaricato.
Quando serve l'autenticazione, usate PROXYUSERNAME e PROXYPASSWORD di PycURL per l'intermediario; le credenziali del server FTP appartengono alla connessione FTP.