Python ftplib 超时

13 投票
2 回答
23405 浏览
提问于 2025-04-16 02:35

我正在尝试使用ftplib这个库来获取文件列表,并下载自上次检查以来的新文件。我现在尝试运行的代码是:

#!/usr/bin/env python
from ftplib import FTP
import sys

host = 'ftp.***.com'
user = '***'
passwd = '***'

try:
    ftp = FTP(host)
    ftp.login(user, passwd)
except:
    print 'Error connecting to FTP server'
    sys.exit()

try:
    ftp.retrlines('LIST')
except:
    print 'Error fetching file listing'
    ftp.quit()
    sys.exit()

ftp.quit() 

每次我运行这个代码时,获取文件列表的时候都会超时。有没有什么建议?

2 个回答

23

如果被动模式因为某些原因不工作,可以试试:

ftp.set_pasv(False)

使用主动模式。

14

很可能是主动模式和被动模式之间的冲突。确保以下其中一条是正确的:

  1. 服务器支持被动模式,而你的客户端也设置为被动模式
  2. 如果服务器不支持被动模式,那么你的防火墙必须支持主动模式的FTP传输。

补充一下:我查看了文档,发现从Python 2.1及以后版本,默认是被动模式。你在连接哪个服务器?你知道它是否支持被动模式吗?

在主动模式(非被动模式)下,客户端会发送一个PORT命令,告诉服务器在那个端口上建立数据连接,这就需要你的防火墙能够识别这个PORT命令,以便把进来的数据连接转发给你——但很少有防火墙支持这个功能。在被动模式下,客户端自己打开数据连接,服务器使用这个连接(服务器在打开数据连接时是“被动”的)。

如果你不确定是否在使用被动模式,可以试试执行 ftp.set_pasv(True),看看是否有变化。

撰写回答