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

2023-11-22

我正在尝试连接到 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()

The ftp.nlst抛出这个错误:

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


我已经使用 FileZilla (在同一台计算机上运行)测试了连接,并且工作正常。

这是 FileZilla 日志:

Status: Connection established, waiting for welcome message...
Status: Insecure server, it does not support FTP over TLS.
Status: Logged in Status: Retrieving directory listing...
Status: Server sent passive reply with unroutable address. Using server address instead.
Status: Directory listing of "/" successful

状态:服务器发送了带有不可路由地址的被动回复

上述情况说明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

在最新版本的 Python(3.6 及更高版本)中,ftplib 不考虑 IP 地址PASV回复在其自己的。


另一种解决方案可能是使用 IPv6。看Python 3.8.5 FTPS 连接.

对于具有类似后果的不同问题,请参见vsftpd 返回 0,0,0,0 以响应 PASV.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 ftplib 列出 FTP 目录 – 但 FTP 客户端可以工作 的相关文章

随机推荐