2017-11-07 4 views
1

Ich versuche, Dateien von FTP herunterzuladen. Es funktioniert gut zu Hause, aber es funktioniert nicht, wenn ich durch Firmennetzwerk laufe. Ich weiß, dass es etwas mit Proxy zu tun hat. Ich habe ein paar Posts bezüglich des Proxy-Problems in Python angeschaut. Ich habe versucht, eine Verbindung zum Proxy herzustellen. Es funktioniert in Ordnung für die URL, aber es scheiterte bei der Verbindung zu FTP. Kennt jemand einen Weg, das zu tun? Danke im Voraus.Verbindung mit ftplib über FTP-Proxy in Python?

Unten ist mein Code:

import os 
import urllib 
import ftplib 
from ftplib import FTP 
from getpass import getpass 
from urllib.request import urlopen, ProxyHandler, HTTPHandler,  HTTPBasicAuthHandler, \ 
           build_opener, install_opener 

user_proxy = "XXX" 
pass_proxy = "YYY" 
url_proxy = "ZZZ" 
port_proxy = "89" 
url_proxy = "ftp://%s:%[email protected]%s:%s" % (user_proxy, pass_proxy, url_proxy,  port_proxy) 
authinfo = urllib.request.HTTPBasicAuthHandler() 
proxy_support = urllib.request.ProxyHandler({"ftp" : url_proxy}) 

# build a new opener that adds authentication and caching FTP handlers 
opener = urllib.request.build_opener(proxy_support, authinfo, 
           urllib.request.CacheFTPHandler) 

# install it 
urllib.request.install_opener(opener) 

#url works ok 
f = urllib.request.urlopen('http://www.google.com/') 
print(f.read(500)) 
urllib.request.install_opener(opener) 

#ftp is not working 
ftp = ftplib.FTP('ftp:/ba1.geog.umd.edu', 'user', 'burnt_data') 

Die Fehlermeldung bekam ich:

730  # and socket type values to enum constants. 
731  addrlist = [] 
--> 732  for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 
733   af, socktype, proto, canonname, sa = res 
734   addrlist.append((_intenum_converter(af, AddressFamily), 

gaierror: [Errno 11004] getaddrinfo failed 

Ich kann über den Proxy-Verbindung über FileZilla, indem Sie benutzerdefinierte FTP-Proxy mit Spezifikation:

USER %[email protected]%h %s 
PASS %p 
ACCT %w 

FTP Proxy using FileZilla

+0

Ihr "url" Beweis scheint verdächtig. Sie erstellen 'ftp: //' proxy für 'ftp'-Protokoll. Und wenn Sie 'http: //' URL öffnen. Ich glaube nicht, dass der Proxy überhaupt in diese Anfrage involviert ist. Ich bin mir ziemlich sicher, dass 'f = urllib.request.urlopen ('http://www.google.com/')' auch ohne den vorherigen Proxy-Code funktioniert. –

+0

Auch Sie müssen uns sagen, welche Art von Proxy Sie verwenden. Ist das HTTP, SOCKS oder FTP-Proxy? Idealerweise zeigen Sie uns eine Protokolldatei eines beliebigen eigenständigen FTP-Clients (z. B. WinSCP) an, der für die Verwendung dieses Proxys konfiguriert ist. –

+0

Danke Martin, ich habe den Screenshot des FTP-Proxy von fileZilla oben eingefügt. Ich verstehe immer noch nicht, wie ich den Code ändern soll. –

Antwort

0

Sie verbinden sich mit einem FTP-Proxy.

FTP-Proxy kann nicht mit HTTP arbeiten, so dass Ihr Test gegen http:// URL zu www.google.com ist völlig irrelevant und beweist nichts.

FTP-Proxy funktioniert als FTP-Server. Sie stellen eine Verbindung zum Proxy statt zum tatsächlichen Server her. Verwenden Sie dann eine spezielle Syntax eines Benutzernamens (oder anderer Anmeldeinformationen), um Ihren tatsächlichen FTP-Zielserver und seine Anmeldeinformationen anzugeben. In Ihrem Fall ist die spezielle Syntax des Benutzernamens [email protected] user_proxy.

für Ihren speziellen Fall Dies sollte funktionieren:

sollte
host_proxy = '192.168.149.50' 
user_proxy = 'XXX' 
pass_proxy = 'YYY' 

user = 'user' 
pass = 'burnt_data' 
host = 'ba1.geog.umd.edu' 

u = "%[email protected]%s %s" % (user, host, user_proxy) 

ftp = ftplib.FTP(host_proxy, u, pass, pass_proxy) 

Kein anderer Code (urllib oder andere) erforderlich sein.

+0

Danke Martin, ich habe das probiert aber immer noch eine Fehlermeldung beim Durchlaufen von ftp.connect bekommen. ConnectionResetError Traceback (letzter Anruf liest) in () 12 ftp = ftplib.FTP() ---> 13 ftp.connect (host_proxy, port_proxy) 14 ftp.login (u, passwd, pass_proxy) 15 drucken (ftp.dir()) ConnectionResetError: [WinError 10054] Eine bestehende Verbindung wurde zwangsweise vom Remote-Host geschlossen –

+0

Was "Fehlermeldung"? –

+0

Was ist der wirkliche Wert, den Sie für 'port_proxy' verwenden? –