Een FTP-download via SOCKS met PycURL
Laat libcurl de controle- en passieve dataverbinding van een FTP-download via een SOCKS5-proxy afhandelen.
PycURL biedt libcurls FTP- en SOCKS-ondersteuning via één transfer-handle. Bij een passieve FTP-download kan de toepassing zowel de controleverbinding als de afzonderlijke dataverbinding aan die implementatie overlaten.
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 is de FTP-resource-URL van de toepassing, en output is een al geopende binaire uitvoerstroom. De time-outs zijn voorbeeldgrenzen die gekozen moeten worden op basis van de verwachte bestandsgrootte en verbinding. Voor een openbare FTP-resource waar openbare tussenpersonen zijn toegestaan, biedt de SOCKS5-proxylijst kandidaten voor de proxy-URL; controleer of het gekozen knooppunt zowel de controle- als de passieve databestemming toestaat.
socks5h delegeert de resolutie van de doelhostnaam aan de SOCKS-proxy. NOPROXY is bewust leeg, zodat een geërfde no_proxy-omgevingsinstelling de route voor deze overdracht niet omzeilt.
Laat actieve FTP uitgeschakeld: dat verwacht een inkomende serververbinding en is in deze proxymodus niet beschikbaar. Het uitgaande beleid van de proxy moet de FTP-controlepoort en de voor de overdracht gekozen passieve datapoort toestaan. Een geslaagde login bewijst dus op zichzelf niet dat het bestand kan worden gedownload.
Als verificatie nodig is, gebruik dan PycURLs PROXYUSERNAME en PROXYPASSWORD voor de tussenpersoon; de inloggegevens van de FTP-server horen bij de FTP-verbinding.