用Python建立ftp代理

2024-10-01 11:35:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

到目前为止,我们已经:

Proxy = officeproxy.com:8080

FTP = ftp.cal.com

User = papa

PW = tango123 

以上不是真实的实体,所以如果你想换成真实的实体,就请便。在

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

我运行的是python2.7。在

到目前为止,我已经到处找过了,有了这个代码。OP说这只是一个测试FTP连接和读取一个文件的短模块。在

(注意:我故意在很多地方放#来显示我不知道该怎么填,或者其他原因):

^{pr2}$

Tags: 模块文件实体服务器com站点windows计算机
3条回答

这个问题有点过时,但我自己没有找到任何最近的解决办法,所以我想我会提供我找到的解决办法。在我的例子中,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代理服务器,Martin的答案是可行的。您也可以在FileZilla中看到FTP代理的行为,这将有助于为您的需求编写代码

希望这对某人有帮助!在

注意,我在SO上找到了一些similarquestions,但是由于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服务器。我编写它的方式是假设代理设置为在指定的端口(在您的示例中是8080)上转发FTP协议。如果不是这样的话,这是行不通的。
  3. 启用调试日志记录。从the ftplib documentation

FTP.set_debuglevel(level): 0, produces no debugging output... 1 produces a moderate amount of debugging output... 2 or higher produces the maximum amount of debugging output

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

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

相关问题 更多 >