使用Python设置ftp代理

时间:2017-08-02 23:35:04

标签: python python-2.7 proxy ftp

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

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

我们打电话给ftp网站“ftp.cal.com”。用户名是“papa”。密码是“tango123”。

到目前为止,我们已经:

Proxy = officeproxy.com:8080

FTP = ftp.cal.com

User = papa

PW = tango123 

上面不是真正的实体,所以如果你想把它们换成真正的实体,那就做我的客人。

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

我正在运行Python 2.7。

到目前为止,我已经搜索过并拥有此代码。 OP表示它只是一个测试FTP连接并读取一个文件的简短模块。

(注意:当我不知道填写或其他原因时,我故意将#放在很多地方展示:

import urllib2
# I have filled in the proxy info
proxy_host = 'officeproxy.com:8080'

# I don't think this needs any modification, right?  
proxy_handler = urllib2.ProxyHandler({'ftp': proxy_host})

# ditto here 
proxy_auth_handler = urllib2.ProxyBasicAuthHandler() 

# now here is where I am unsure what to put; 
# also, I really need FTP user and FTP password, and NOT Proxy... 
# so what do I need to change here?
proxy_auth_handler.add_password(None, proxy_host, proxy_user, proxy_passwd) 
opener_thru_proxy = urllib2.build_opener(proxy_handler, proxy_auth_handler)

# I filled in this part
conn = opener_thru_proxy.open('ftp://ftp.cal.com/hello.txt') 

# I don't believe I need to change this, right?
print conn.read()

3 个答案:

答案 0 :(得分:0)

注意,我在SO上发现了一些similar questions,但是当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 

这是代码正在做的事情:

  1. 导入ftplib包。
  2. 通过代理连接到FTP服务器。我编写它的方式假设代理设置为在指定的端口上转发FTP协议(在您的示例中为8080)。 如果不是这种情况,则不起作用。
  3. 启用调试日志记录。来自the ftplib documentation
  4.   

    FTP.set_debuglevel(level)0,不产生调试输出... 1产生适量的调试输出...... 2或更高产生最大调试量输出

    1. 使用user =“papa”,passwd =“tango123”登录FTP服务器。同样,这来自ftplib documentation for login()
    2. Open a local file用于写入您要从FTP服务器检索的文件内容。第一个参数是要保存到的文件的文件名(可以是任何内容,我决定使用与FTP服务器上的文件名相同的文件名)。第二个参数是你要打开文件的模式,它是一串标志:w ='写模式',b ='二进制模式',因为我们要检索文件作为二进制文件并将其写为二进制文件。
    3. 我建议你阅读ftplib documentation for retrbinary。首先要理解这一点有点棘手。第一个参数"RETR" + filename是发送到FTP服务器的命令,在本例中为RETR hello.txt。第二个参数f.write回调函数,只要它有来自服务器的数据块,您希望ftp.retrbinary函数调用。在其实施中,只要retrbinary有数据,它就会调用f.write(data),其中data是其拥有的最新数据块。要了解回调在Python中的工作原理,请参阅Introduction to Asynchronous APIs in Python
    4. 我希望这对您有用,我希望答案足够详细,让您了解它的工作原理。如果它不起作用,请发布堆栈跟踪输出以获取错误。

答案 1 :(得分:0)

这个问题有点过时了,但是我本人没有找到任何最新的解决方案,因此我想我会提供找到的解决方案。就我而言,办公室代理需要凭据,因此这些凭据将包含在解决方案中。我想如果您的代理不需要凭据,就可以删除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()

我希望这会有所帮助。

答案 2 :(得分:0)

将其添加为最重要的结果之一,并且努力寻找解决方案。

如果您的代理服务器是 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代理的行为,这将有助于为您的要求进行编码

希望这对某人有帮助!