【问题标题】:Cannot list FTP directory using ftplib – but FTP client works无法使用 ftplib 列出 FTP 目录 - 但 FTP 客户端可以工作
【发布时间】:2019-09-12 20:18:10
【问题描述】:

我正在尝试连接到 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 日志:

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

【问题讨论】:

标签: python ftp ftplib


【解决方案1】:

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

以上表示FTP服务器配置错误。它将其内部网络 IP 发送到外部网络(发送到客户端 - FileZilla 或 Python ftplib),在该位置它是无效的。 FileZilla 可以检测到并自动回退到服务器的原始 IP 地址。

Python ftplib 不做这种检测。

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


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

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。见Python 3.8.5 FTPS connection

对于具有类似后果的不同问题,请参阅vsftpd returns 0,0,0,0 in response to PASV

【讨论】:

  • 你是最棒的。我对互联网上关于这件事的信息如此之少感到震惊
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多