, लेकिन मेरे समाधान जब होस्ट नाम एक श्वेत सूची से मेल खाता है एक HTTP प्रॉक्सी का उपयोग करने के socket.create_connection()
पैच करने के लिए किया गया था:
आप इसे वहाँ प्राप्त कर सकते हैं:
from base64 import b64encode
from functools import wraps
import socket
_real_create_connection = socket.create_connection
_proxied_hostnames = {} # hostname: (proxy_host, proxy_port, proxy_auth)
def register_proxy (host, proxy_host, proxy_port, proxy_username=None, proxy_password=None):
proxy_auth = None
if proxy_username is not None or proxy_password is not None:
proxy_auth = b64encode('{}:{}'.format(proxy_username or '', proxy_password or ''))
_proxied_hostnames[host] = (proxy_host, proxy_port, proxy_auth)
@wraps(_real_create_connection)
def create_connection (address, *args, **kwds):
host, port = address
if host not in _proxied_hostnames:
return _real_create_connection(address, *args, **kwds)
proxy_host, proxy_port, proxy_auth = _proxied_hostnames[host]
conn = _real_create_connection((proxy_host, proxy_port), *args, **kwds)
try:
conn.send('CONNECT {host}:{port} HTTP/1.1\r\nHost: {host}:{port}\r\n{auth_header}\r\n'.format(
host=host, port=port,
auth_header=('Proxy-Authorization: basic {}\r\n'.format(proxy_auth) if proxy_auth else '')
))
response = ''
while not response.endswith('\r\n\r\n'):
response += conn.recv(4096)
if response.split()[1] != '200':
raise socket.error('CONNECT failed: {}'.format(response.strip()))
except socket.error:
conn.close()
raise
return conn
socket.create_connection = create_connection
मैं भी ftplib.FTP का एक उपवर्ग कि host
PASV
और EPSV
एफ़टीपी आदेशों द्वारा दिया पर ध्यान नहीं देता बनाने के लिए किया था। उदाहरण उपयोग:
from ftplib import FTP
import paramiko # For SFTP
from proxied_socket import register_proxy
class FTPIgnoreHost (FTP):
def makepasv (self):
# Ignore the host returned by PASV or EPSV commands (only use the port).
return self.host, FTP.makepasv(self)[1]
register_proxy('ftp.example.com', 'proxy.example.com', 3128, 'proxy_username', 'proxy_password')
ftp_connection = FTP('ftp.example.com', 'ftp_username', 'ftp_password')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # If you don't care about security.
ssh.connect('ftp.example.com', username='sftp_username', password='sftp_password')
sftp_connection = ssh.open_sftp()
ऊपर जवाब में लिंक है 404. मतलब हो सकता है यह एक: http : //mail.python.org/pipermail/python-list/2004- अक्टूबर/863602.html – AndrewR
"अज्ञात ftp.download.com" भाग शुद्ध कथा है। किसी भी सर्वर द्वारा किसी भी सर्वर द्वारा लागू/समर्थित किसी भी आरएफसी या में इसका कुछ भी उल्लेख नहीं किया गया है, जहां तक मुझे पता है। मूल रूप से, एफ़टीपी प्रोटोकॉल प्रॉक्सीइंग का समर्थन नहीं करता है। AFAIK, एफ़टीपी प्रॉक्सी करने का एकमात्र तरीका एक सॉक्स का उपयोग करके है, जिस स्थिति में क्लाइंट को सॉक्स से कनेक्ट करना होता है और बाद वाले को निर्देश दिया जाना चाहिए कि वास्तविक FTP सर्वर क्या है। –
यह उत्तर मुझे एक असली बड़ा सिरदर्द हल करता है। धन्यवाद!!! – dgg32