截图Total Commander连接日志:
我想用python做这样的连接。
我有python programm(ftplib),我想使用NTLM(host_proxy,host_port,user_proxy,pass_proxy)连接到Squid代理服务器,然后使用ftplib(host_ftp,user_ftp,pass_ftp)连接到ftp。
我尝试了不同的方法,但没有成功。 有错误:
HTTP/1.1 407 Proxy Authentification Required
X-Squid-Error: ERR_CACHE_ACCESS_DENIED 0
或
HTTP/1.1 403 Forbidden
X-Squid-Error: ERR_ACCESS_DENIED 0
或
WinError 10060 TimeOut
-
#!/usr/bin/python
import socket
# Class that wraps a real socket and changes it to a HTTP tunnel whenever a connection is asked via the "connect" method
class ProxySock :
def __init__(self, socket, proxy_host, proxy_port) :
# First, use the socket, without any change
self.socket = socket
# Create socket (use real one)
self.proxy_host = proxy_host
self.proxy_port = proxy_port
# Copy attributes
self.family = socket.family
self.type = socket.type
self.proto = socket.proto
def connect(self, address) :
# Store the real remote adress
(self.host, self.port) = address
# Try to connect to the proxy
for (family, socktype, proto, canonname, sockaddr) in socket.getaddrinfo(
self.proxy_host,
self.proxy_port,
0, 0, socket.SOL_TCP) :
try:
# Replace the socket by a connection to the proxy
self.socket = socket.socket_formal(family, socktype, proto)
self.socket.connect(sockaddr)
except socket.error(msg):
if self.socket:
self.socket.close()
self.socket = None
continue
break
if not self.socket :
raise socket.error(ms)
# Ask him to create a tunnel connection to the target host/port
data = (("CONNECT %s:%d HTTP/1.1\r\n" + "Host: %s\r\n\r\n") % (self.host, self.port, self.host));
print(data)
wait = input('input 1: ')
data = data.encode()
self.socket.send(data);
# Get the response
resp = self.socket.recv(1024).decode()
print(resp)
wait = input('input 2: ')
# Parse the response
parts = resp.split()
# Not 200 ?
if '200' not in str(resp) :
raise Exception("Error response from Proxy server : %s" % resp)
# Wrap all methods of inner socket, without any change
def accept(self) :
return self.socket.accept()
def bind(self, *args) :
return self.socket.bind(*args)
def close(self) :
return self.socket.close()
def fileno(self) :
return self.socket.fileno()
def getsockname(self) :
return self.socket.getsockname()
def getsockopt(self, *args) :
return self.socket.getsockopt(*args)
def listen(self, *args) :
return self.socket.listen(*args)
def makefile(self, *args) :
return self.socket.makefile(*args)
def recv(self, *args) :
return self.socket.recv(*args)
def recvfrom(self, *args) :
return self.socket.recvfrom(*args)
def recvfrom_into(self, *args) :
return self.socket.recvfrom_into(*args)
def recv_into(self, *args) :
return self.socket.recv_into(buffer, *args)
def send(self, *args) :
return self.socket.send(*args)
def sendall(self, *args) :
return self.socket.sendall(*args)
def sendto(self, *args) :
return self.socket.sendto(*args)
def setblocking(self, *args) :
return self.socket.setblocking(*args)
def settimeout(self, *args) :
return self.socket.settimeout(*args)
def gettimeout(self) :
return self.socket.gettimeout()
def setsockopt(self, *args):
return self.socket.setsockopt(*args)
def shutdown(self, *args):
return self.socket.shutdown(*args)
# Return the (host, port) of the actual target, not the proxy gateway
def getpeername(self) :
return (self.host, self.port)
# Install a proxy, by changing the method socket.socket()
def setup_http_proxy(proxy_host, proxy_port) :
# New socket constructor that returns a ProxySock, wrapping a real socket
def socket_proxy(af, socktype, proto) :
# Create a socket, old school :
sock = socket.socket_formal(af, socktype, proto)
# Wrap it within a proxy socket
return ProxySock(
sock,
proxy_host,
proxy_port)
# Replace the "socket" method by our custom one
socket.socket_formal = socket.socket
socket.socket = socket_proxy
# Imports
import ftplib
PROXY_HOST = 'PROXY_HOST'
PROXY_PORT = 'PROXY_PORT'
PROXY_USER = 'PROXY_USER'
PROXY_PASS = 'PROXY_PASS'
FTP_HOST = 'FTP_HOST'
FTP_USER = 'FTP_USER'
FTP_PASS = 'FTP_PASS'
# Install the proxy on the "socket" module
setup_http_proxy(PROXY_HOST, PROXY_PORT)
# Now, the libftp module can do FTP over HTTP !!, transaprently
u = "%s@%s %s" % (FTP_USER, FTP_HOST, PROXY_USER)
ftp = ftplib.FTP(PROXY_HOST, u, FTP_PASS, PROXY_PASS)