繁体   English   中英

通过 Python 中的 FTP 代理与 ftplib 连接?

[英]Connecting with ftplib via FTP proxy in Python?

我正在尝试从 FTP 下载文件。它在家里工作正常,但当我通过 company's.network 时它不起作用。 我知道与代理有关。 我查看了 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

FTP 使用 FileZilla 的代理

您正在使用 FTP 代理进行连接。

FTP 代理无法与 HTTP 一起使用,因此您针对www.google.com http:// URL 进行的测试完全无关紧要,并且无法证明任何内容。

FTP 代理充当 FTP 服务器。 您连接到代理,而不是连接到实际服务器。 然后使用用户名(或其他凭据)的一些特殊语法来指定您的实际目标 FTP 服务器及其凭据。 在您的情况下,用户名的特殊语法是user@host user_proxy 您的代理需要 FTP ACCT命令中的代理密码。

这应该适用于您的特定情况:

host_proxy = '192.168.149.50'
user_proxy = 'XXX'
pass_proxy = 'YYY'

user = 'user'
user_pass = 'burnt_data'
host = 'ba1.geog.umd.edu'

u = "%s@%s %s" % (user, host, user_proxy)

ftp = ftplib.FTP(host_proxy, u, user_pass, pass_proxy)

不需要其他代码( urllib或任何其他代码)。

如果代理使用自定义端口(不是 21),请使用:

ftp = ftplib.FTP()
ftp.connect(host_proxy, port_proxy)
ftp.login(u, user_pass, pass_proxy)

使用@Martin Prikryl 的上述答案后出现此错误:

Traceback (most recent call last):
  File "C:\routftp.py", line 21, in <module>
    ftp.connect(PROXY_HOST, PROXY_PORT)
  File "C:\Python39\lib\ftplib.py", line 162, in connect
    self.welcome = self.getresp()
  File "C:\Python39\lib\ftplib.py", line 244, in getresp
    resp = self.getmultiline()
  File "C:\Python39\lib\ftplib.py", line 230, in getmultiline
    line = self.getline()
  File "C:\Python39\lib\ftplib.py", line 218, in getline
    raise EOFError
EOFError

顺便说一句,我的 FTP 主机需要显式 TLS,所以我正在做ftp = ftplib.FTP_TLS()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM