9

私はPythonftplibでFTPクライアントを開発しています。プロキシサポートを追加するにはどうすればよいですか(私が見たほとんどのFTPアプリはそれを持っているようです)?私は特にSOCKSプロキシについて考えていますが、他のタイプも考えています... FTP、HTTP(FTPプログラムでHTTPプロキシを使用することも可能ですか?)

それを行う方法はありますか?

4

6 に答える 6

8

このソースの通り

プロキシによって異なりますが、一般的な方法はプロキシに ftp で接続し、宛先サーバーのユーザー名とパスワードを使用することです。

たとえば、ftp.example.com の場合:

Server address: proxyserver (or open proxyserver from with ftp)
User:           anonymous@ftp.example.com
Password:       password

Python コードの場合:

from ftplib import FTP
site = FTP('my_proxy')
site.set_debuglevel(1)
msg = site.login('anonymous@ftp.example.com', 'password')
site.cwd('/pub')
于 2009-08-18T12:44:33.820 に答える
4

でProxyHandlerを使用できますurllib2

ph = urllib2.ProxyHandler( { 'ftp' : proxy_server_url } )
server= urllib2.build_opener( ph )
于 2009-08-18T12:52:04.160 に答える
3

私は同じ問題を抱えており、ftplib モジュールを使用する必要がありました(すべてのスクリプトを URLlib2 で書き直す必要はありません)。

透過的なHTTP トンネリングをソケット層 (ftplib で使用) にインストールするスクリプトを作成できました。

これで、 FTP over HTTP を透過的に実行できるようになりました。

そこから入手できます: http://code.activestate.com/recipes/577643-transparent-http-tunnel-for-python-sockets-to-be-u/

于 2011-04-07T13:31:39.223 に答える
2

標準モジュールftplibはプロキシをサポートしていません。唯一の解決策は、独自のカスタマイズされたバージョンのftplib.

于 2009-08-18T12:42:28.013 に答える
0

requestsCONNECT トンネリングをサポートしない squid プロキシでテストされた、を使用した回避策を次に示します。

def ftp_fetch_file_through_http_proxy(host, user, password, remote_filepath, http_proxy, output_filepath):
    """
    This function let us to make a FTP RETR query through a HTTP proxy that does NOT support CONNECT tunneling.
    It is equivalent to: curl -x $HTTP_PROXY --user $USER:$PASSWORD ftp://$FTP_HOST/path/to/file
    It returns the 'Last-Modified' HTTP header value from the response.

    More precisely, this function sends the following HTTP request to $HTTP_PROXY:
        GET ftp://$USER:$PASSWORD@$FTP_HOST/path/to/file HTTP/1.1
    Note that in doing so, the host in the request line does NOT match the host we send this packet to.

    Python `requests` lib does not let us easily "cheat" like this.
    In order to achieve what we want, we need:
    - to mock urllib3.poolmanager.parse_url so that it returns a (host,port) pair indicating to send the request to the proxy
    - to register a connection adapter to the 'ftp://' prefix. This is basically a HTTP adapter but it uses the FULL url of
    the resource to build the request line, instead of only its relative path.
    """
    url = 'ftp://{}:{}@{}/{}'.format(user, password, host, remote_filepath)
    proxy_host, proxy_port = http_proxy.split(':')

    def parse_url_mock(url):
        return requests.packages.urllib3.util.url.parse_url(url)._replace(host=proxy_host, port=proxy_port, scheme='http')

    with open(output_filepath, 'w+b') as output_file, patch('requests.packages.urllib3.poolmanager.parse_url', new=parse_url_mock):
        session = requests.session()
        session.mount('ftp://', FTPWrappedInFTPAdapter())
        response = session.get(url)
        response.raise_for_status()
        output_file.write(response.content)
        return response.headers['last-modified']


class FTPWrappedInFTPAdapter(requests.adapters.HTTPAdapter):
    def request_url(self, request, _):
        return request.url
于 2016-09-02T14:44:17.783 に答える