在python中通过不同网络的FTP

时间:2013-06-29 16:29:08

标签: python ftp

我和我的朋友已经承担了一个小项目作为我们夏天的计划,我们正在尝试使用python作为项目的一部分使用FTP。我们可以通过同一网络成功传输文件,但是当我们通过互联网(通过不同的网络)连接时,我们不知道如何传输文件。我添加了代码供您参考。我是FTP和python的新手,如果有人可以帮助我们,那将是很棒的。

服务器端程序:

 #server.py

 from pyftpdlib.ftpserver import DummyAuthorizer
 from pyftpdlib.ftpserver import FTPHandler
 from pyftpdlib.ftpserver import FTPServer

 authorizer = DummyAuthorizer()
 authorizer.add_user("user", "12345", "/", perm="elradfmw")
 authorizer.add_anonymous("/")
 handler = FTPHandler
 handler.authorizer = authorizer
 server = FTPServer(("xxx.xxx.x.x", 2121), handler)
 server.serve_forever()

客户端程序:

 #client.py
 import ftplib

 fileTransfer = ftplib.FTP()
 fileTransfer.connect("xxx.xxx.x.x",2121)
 fileTransfer.login('user','12345')
 fileTransfer.retrlines('LIST')
 fileTransfer.cwd('/home/royal/MyPrograms/Python')
 fileTransfer.retrbinary('RETR  Florida.mp3',open('club.mp3','wb').write)

我在NAT后面工作。

2 个答案:

答案 0 :(得分:4)

您可能遇到了防火墙问题;使用passive mode FTP应该有所帮助。在该链接上有一个很好的解释,但简短版本是默认情况下FTP使用“活动”模式,其中客户端创建与服务器的连接以发出请求,然后服务器创建 new 连接到客户端进行响应。大多数防火墙都配置为阻止“自发”入站连接,除非防火墙专门配置为从客户端查看出站连接的内容并看到“啊哈,一个FTP请求,我应该期待来自该服务器的传入连接很快“,它将阻止连接。

另一方面,

被动模式让客户端创建两个出站连接,一个用于请求,另一个用于(在不同的,随机选择的端口上)服务器将用于发送响应。现成的路由器+防火墙解决方案,在其默认配置中,将允许所有出站连接通过,因此这将使客户端的防火墙通过连接。但是,在服务器端配置防火墙会更难,因为数据的传入连接可能在任何端口上 - 除非您缩小被动数据端口范围。

所以你应该做的是:

  • 使用被动模式。
  • 将服务器配置为接受一定范围的端口(例如,34500到34510,随机选择数字 - 它不需要非常大的范围)用于其被动数据传输
  • 在服务器端配置防火墙以允许该端口范围以及“普通”FTP端口(在您的情况下为2121)上的传入连接

如果您遇到的问题是防火墙问题,那么它应该适合您。如果它还没有工作;你可能有另一个问题,所以继续问一个新问题! (或者,如果明确与防火墙问题相关,请更新此项。)

答案 1 :(得分:1)

我认为您的问题的解决方案是端口转发

portforwarding.com