使用Python设置ftp代理

使用Python设置ftp代理,python,python-2.7,proxy,ftp,Python,Python 2.7,Proxy,Ftp,我们正在尝试开发一个Python模块,它将访问FTP服务器并将文件下载到我的本地机器上。当我们尝试运行模块的FTP部分时,它正在超时 我们有一个代理服务器(我们称之为“officeproxy.com:8080”)来处理这个问题,当使用像FileZilla或Windows Explorer这样的FTP客户端访问FTP站点时,我们是成功的 让我们把ftp站点称为“ftp.cal.com”。用户名是“爸爸”。密码是“tango123” 到目前为止,我们已经: Proxy = officeproxy.c

我们正在尝试开发一个Python模块,它将访问FTP服务器并将文件下载到我的本地机器上。当我们尝试运行模块的FTP部分时,它正在超时

我们有一个代理服务器(我们称之为“officeproxy.com:8080”)来处理这个问题,当使用像FileZilla或Windows Explorer这样的FTP客户端访问FTP站点时,我们是成功的

让我们把ftp站点称为“ftp.cal.com”。用户名是“爸爸”。密码是“tango123”

到目前为止,我们已经:

Proxy = officeproxy.com:8080

FTP = ftp.cal.com

User = papa

PW = tango123 
上面这些不是真实的实体,所以如果你想把它们换成真实的实体,请随意

我需要一个模块,首先加载代理服务,然后运行FTP部分

我正在运行Python 2.7

到目前为止,我已经到处搜索并获得了此代码。OP说它只是一个测试FTP连接并读取一个文件的短模块

(注意:我故意在很多地方放置了
#
,以便在我不知道如何填写或其他原因时显示):

注意,我发现有一些是这样的,但由于OP要求一个详细的初学者级别的答案,我决定发布这个

为了澄清,以下是我对您想要实现的目标的理解:

  • 您在代理后面有一个FTP服务器
  • FTP服务器需要用户/密码凭据,但代理本身不需要
一种选择是使用
ftplib
包。像Python这样的流行语言的一个巨大优势是可以提供特定功能的良好实现的包的广泛选择。在这种情况下,ftp客户端:

import ftplib  # 1

ftp = ftplib.FTP("officeproxy.com:8080")  # 2
ftp.set_debuglevel(1)  # 3
ftp.login("papa", "tango123")  # 4

filename = "hello.txt"
f = open(filename, 'wb')  # 5 
ftp.retrbinary("RETR " + filename , f.write)  # 6

f.close()   # cleanup file handle
ftp.quit()  # cleanup ftp client 
下面是代码的作用:

  • 导入
    ftplib
  • 通过代理连接到FTP服务器。我编写它的方式假设代理被设置为在指定的端口上转发FTP协议(在您的示例中为8080)。如果不是这样,这将不起作用
  • 启用调试日志记录。发件人:
  • FTP.set_debuglevel(level)
    0
    ,不产生调试输出<代码>1产生适量的调试输出
    2
    或更高版本会产生最大数量的调试输出

  • 使用user=“papa”,passwd=“tango123”登录FTP服务器。同样,这是来自
  • 用于写入要从FTP服务器检索的文件内容。第一个参数是要保存到的文件的文件名(它可以是任何文件,我决定使用与FTP服务器上的文件名相同的文件名)。第二个参数是您希望打开文件的模式,这是一个标志字符串:w='write mode',b='binary mode',因为我们将以二进制方式检索文件并以二进制方式写入
  • 我建议你读这本书。一开始理解起来有点棘手。第一个参数“RETR”+filename是发送到FTP服务器的命令,在本例中为
    RETR hello.txt
    。第二个参数,
    f.write
    是您希望
    ftp.retrbinary
    函数在从服务器获得数据块时调用的回调函数。在它的实现中,只要
    retrbinary
    有数据,它就会调用
    f.write(data)
    ,其中
    data
    是它拥有的最新数据块。要了解回调如何在Python中工作,请参阅

  • 我希望这对你有用,我希望答案足够详细,让你明白它是如何工作的。如果它不起作用,请为您得到的错误发布堆栈跟踪输出。

    这个问题有点过时,但我自己没有找到任何最近的解决方案,所以我想我会提供我找到的解决方案。在我的例子中,office代理需要凭据,因此这些凭据包含在解决方案中。如果您的代理不需要凭据,我假定您可以删除proxy_user和proxy_passwd。我在Python 3.6中得到的代码是:

    from ftplib import FTP
    
    ftp = FTP("officeproxy.com")
    ftp.set_debuglevel(1)
    ftp.login(user='ftp_user@ftp_host proxy_user', passwd='ftp_passwd', acct='proxy_passwd')
    
    # Do whatever you need on the FTP server here
    
    ftp.quit()
    

    我希望这能有所帮助。

    添加这一点,因为这是最好的结果之一,并且很难找到解决方案

    如果您的代理是一个HTTP代理,您需要对其进行身份验证,那么这就是如何:

    import socks
    import socket
    
    socks.set_default_proxy(socks.HTTP, 
            proxy_host, 
            proxy_port, 
            username=proxy_username, 
            password=proxy_password
    )
    socket.socket = socks.socksocket
    ftp = FTP(ftp_host)
    ftp.set_debuglevel(1) 
    ftp.login(
            user=ftp_user,
            passwd=ftp_password
    )
    
    否则,对于FTP代理马丁的答案有效。您也可以在FileZilla中看到FTP代理的行为,这将有助于为您的需求编写代码


    希望这对别人有帮助

    你能用错误堆栈跟踪更新你的问题吗?谢谢你的输入。我今天将尝试实现这一点,并将结果反馈给您!我想我们可能有点沟通错误。当我开始将代码插入模块时,我意识到我们缺少FTP地址(第2节)。所以我想重新审视一下事件的预期顺序。对不起,由于时间限制,我被切断了。不管怎样,沟通失误是我的错。FTP服务器不是我们的,它属于我们的供应商,我们无法控制它。我们公司的IT部门已经做了一些事情来限制从防火墙后面传出的FTP请求,这就是为什么我需要一种方法来绕过这个限制,而不是使用我们的代理服务器。我在FTP客户端(FileZilla)上有效地使用了代理服务器,因此我知道一旦初始化了代理,它就可以通过。因此,我认为需要遵循以下顺序:1)创建代理事件处理程序(使用officeproxy.com)此时不需要身份验证。2) 创建FTP处理程序到信息,其中包括a)FTP地址[FTP.cal.com],b)用户[papa]和c)PW[tango123]以登录到FTP服务器。照此,身份验证在代理初始化后进行。我希望这能澄清一些。哦,我现在明白了。让我来研究一下,更新一下我的答案。
    import socks
    import socket
    
    socks.set_default_proxy(socks.HTTP, 
            proxy_host, 
            proxy_port, 
            username=proxy_username, 
            password=proxy_password
    )
    socket.socket = socks.socksocket
    ftp = FTP(ftp_host)
    ftp.set_debuglevel(1) 
    ftp.login(
            user=ftp_user,
            passwd=ftp_password
    )