使用Python设置ftp代理
我们正在尝试开发一个Python模块,它将访问FTP服务器并将文件下载到我的本地机器上。当我们尝试运行模块的FTP部分时,它正在超时 我们有一个代理服务器(我们称之为“officeproxy.com:8080”)来处理这个问题,当使用像FileZilla或Windows Explorer这样的FTP客户端访问FTP站点时,我们是成功的 让我们把ftp站点称为“ftp.cal.com”。用户名是“爸爸”。密码是“tango123” 到目前为止,我们已经:使用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
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.set_debuglevel(level)
:0
,不产生调试输出<代码>1产生适量的调试输出2
或更高版本会产生最大数量的调试输出
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
)