*get* '227 Entering Passive Mode (10,19,1,137,195,128).n'
问题是服务器在对PASV命令的响应内返回了错误的IP地址。这对于某些内部防火墙后的内部网络中的服务器来说是典型的。在这种情况下,返回10.19.1.137,这是仅在本地网络中可用的IP地址。
这是FTP服务器的错误设置。但是不幸的是,这种中断的设置很常见,因此许多客户端通过忽略响应中给定的IP地址并改用控制连接的IP地址来解决此问题。ftplib不支持这种解决方法。但是可以用猴子修补它来提供这种支持:
from ftplib import FTP_TLS# replace original makepasv function with one which always returns# the peerhost of the control connections as peerhost for the data# connection_old_makepasv = FTP_TLS.makepasvdef _new_makepasv(self): host,port = _old_makepasv(self) host = self.sock.getpeername()[0] return host,portFTP_TLS.makepasv = _new_makepasvftp = FTP_TLS(ipAddress)ftp.login(...)ftp.nlst()
已通过Python 2.7.12和Python 3.5.2成功测试



