如何为活动模式下的FTP服务器指定客户端数据端口?
我用Python的ftplib库连接一个运行在主动模式的FTP服务器。主动模式的意思是,当我们之间传输数据时,服务器会在我的客户端机器上随机选择一个端口来连接。
我可以指定客户端的数据端口(或者端口范围),让服务器连接到特定的端口吗?我不想在我的防火墙iptables中为FTP服务器打开所有端口。
3 个回答
-2
从Python 3.3开始,ftplib中的一些函数在建立连接时,可以使用一个叫source_addr
的参数,这个参数可以让你做到这一点。
0
你可以重新实现FTP
中的sendport
方法,这样就能发送你想要的IP地址,而不是自动推测出来的那个。可以参考下面的代码:
class PatchedFTP(FTP):
def sendport(self, host, port):
return super(MyFTP, self).sendport("192.0.2.1", port)
ftp = PatchedFTP(ftp_server)
# the rest of the code would be the same
不过通常来说,更好的解决办法是使用被动模式。很多人尝试使用主动模式,因为被动模式在默认代码下无法正常工作,原因是它的外部IP报告错误。想要找到解决方法,可以查看这里:
无法使用ftplib列出FTP目录 - 但FTP客户端可以正常工作
1
用标准的 ftplib模块 是无法做到这一点的。
你要么得找一个其他的库来实现这个功能,要么如果你有勇气的话,可以对你的 FTP
对象里的 makeport()
方法进行修改。