Соединение с ftplib через FTP-прокси в Python?
Я пытаюсь загрузить файлы с FTP. Он отлично работает дома, но не работает, когда я бегу по сети компании. Я знаю, что это связано с прокси. Я посмотрел несколько постов, касающихся проблемы прокси в Python. Я попытался установить соединение с прокси. Он работает нормально для URL, но это не удалось при подключении к FTP. Кто-нибудь знает способ сделать это? Заранее спасибо.
Ниже мой код:
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:%s@%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')
Сообщение об ошибке я получил:
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
Я могу подключиться через прокси с помощью FileZilla, выбрав собственный прокси FTP со спецификацией:
USER %u@%h %s
PASS %p
ACCT %w
1 ответ
Вы подключаетесь через FTP-прокси.
FTP прокси не может работать с HTTP, поэтому ваш тест против http://
URL к www.google.com
совершенно не имеет значения и ничего не доказывает.
FTP-прокси работает как FTP-сервер. Вы подключаетесь к прокси, а не к реальному серверу. Затем используйте специальный синтаксис имени пользователя (или других учетных данных), чтобы указать действительный целевой сервер FTP и его учетные данные. В вашем случае специальный синтаксис имени пользователя user@host user_proxy
,
Это должно работать для вашего конкретного случая:
host_proxy = '192.168.149.50'
user_proxy = 'XXX'
pass_proxy = 'YYY'
user = 'user'
pass = 'burnt_data'
host = 'ba1.geog.umd.edu'
u = "%s@%s %s" % (user, host, user_proxy)
ftp = ftplib.FTP(host_proxy, u, pass, pass_proxy)
Никакой другой код не требуется (urllib
или любой другой).