有没有人使用python 3组合ftp + squid ntlm?

时间:2018-06-06 14:57:51

标签: proxy ftp ntlm squid ftplib

截图Total Commander连接日志:

我想用python做这样的连接。

enter image description here

我有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)

0 个答案:

没有答案