2010-08-10 2 views
8

ftplib을 사용하여 파일 목록을 가져오고 마지막으로 확인한 후 새 파일을 다운로드하려고합니다. 지금까지 실행하려고하는 코드는 다음과 같습니다.Python ftplib timeout

#!/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() 

실행하면 항상 목록을 검색하려고 시도 할 때 시간이 초과됩니다. 어떤 아이디어?

답변

9

대부분 액티브 모드와 패시브 모드가 충돌합니다. 다음 중 하나에 해당 있는지 확인하십시오

  1. 서버가 PASV 모드를 지원하고 서버가 다음 방화벽이 활성 모드 FTP 전송을 지원해야합니다, 수동 모드를 지원하지 않는 경우 클라이언트는 PASV 모드를
  2. 을 설정하는 것입니다.

편집 : 나는 문서를보고 Python 2.1 이상에서 기본값이 수동 모드임을 확인했습니다. 어떤 서버를 사용하고 있으며 수동 모드를 지원하는지 알고 있습니까?

활성 모드 (비 PASV)에서 클라이언트는 포트에 DATA 연결을 시작하도록 서버에 알려주는 PORT 명령을 전송합니다. 방화벽은 PORT 명령을 인식하여 들어오는 DATA 연결을 사용자에게 전달할 수 있어야합니다 -이 기능을 지원하는 방화벽은 거의 없습니다. 패시브 모드에서 클라이언트는 DATA 연결을 열고 서버가 데이터 연결을 사용합니다 (서버는 데이터 연결을 열 때 "수동"입니다).

수동 모드를 사용하지 않는 경우 ftp.set_pasv(True)을 실행하여 차이가 있는지 확인하십시오.

+1

맞아 모드에 문제가있는 것 같습니다. 내가 대화하려고했던 서버는 Active가 필요했습니다. 도와 주셔서 감사합니다! – blcArmadillo

10

은 수동 모드는 어떤 이유로 시도에 대한 실패하는 경우

ftp.set_pasv(False) 

는 액티브 모드를 사용 할 수 있습니다.