Python 无法使用ftplib–;列出FTP目录;但是FTP客户端可以工作

Python 无法使用ftplib–;列出FTP目录;但是FTP客户端可以工作,python,ftp,ftplib,Python,Ftp,Ftplib,我正在尝试连接到FTP,但无法运行任何命令 ftp_server = ip ftp_username = username ftp_password = password ftp = ftplib.FTP(ftp_server) ftp.login(ftp_username, ftp_password) '230 Logged on' ftp.nlst() ftp.nlst抛出此错误: 错误: [WinError 10060]由于连接方在一段时间后没有正确响应,连接尝试失败,或者由于连接主

我正在尝试连接到FTP,但无法运行任何命令

ftp_server = ip
ftp_username = username
ftp_password = password

ftp = ftplib.FTP(ftp_server)
ftp.login(ftp_username, ftp_password)
'230 Logged on'

ftp.nlst()
ftp.nlst
抛出此错误:

错误:
[WinError 10060]由于连接方在一段时间后没有正确响应,连接尝试失败,或者由于连接主机没有响应,建立的连接失败


我已经使用FileZilla(在同一台机器上运行)测试了连接,它运行良好

这是FileZilla日志:

状态:已建立连接,正在等待欢迎消息。。。
状态:服务器不安全,不支持TLS上的FTP。
状态:已登录状态:正在检索目录列表。。。
状态:服务器发送了带有不可终止地址的被动回复。改为使用服务器地址。
状态:目录列表“/”成功
状态:服务器发送了带有不可终止地址的被动回复

以上说明FTP服务器配置错误。它将其内部网络IP发送到外部网络(到客户机–FileZilla或Python ftplib),在那里它是无效的。FileZilla可以检测到这一点,并自动返回到服务器的原始IP地址

Python ftplib不进行这种检测

您需要修复FTP服务器以返回正确的IP地址


如果无法修复服务器(它不是您的,管理员也不配合),您可以让ftplib忽略返回的(无效)IP地址,并通过覆盖
FTP.makepasv来使用原始地址:

class SmartFTP(FTP):
    def makepasv(self):
        invalidhost, port = super(SmartFTP, self).makepasv()
        return self.host, port

ftp = SmartFTP(ftp_server)

# the rest of the code is the same


另一个解决方案可能是使用IPv6。看。

看看这个问题/答案,它解决了我的问题,你是最好的。我对互联网上关于这件事的信息如此之少感到震惊