2010-08-10 14 views
8

Estoy tratando de usar ftplib para obtener una lista de archivos y descargar cualquier archivo nuevo desde mi última comprobación. El código que estoy tratando de correr hasta ahora es:Python ftplib time out

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

Cada vez que ejecuta este el tiempo de espera al intentar recuperar la lista. ¿Algunas ideas?

Respuesta

9

Muy probablemente un conflicto entre el modo activo y el modo pasivo. Asegúrese de que uno de lo siguiente es cierto:

  1. el servidor soporta el modo PASV y su cliente es establecer el modo PASV
  2. Si el servidor no soporta el modo pasivo, a continuación, el servidor de seguridad debe ser compatible con las transferencias FTP en modo activo.

EDIT: Revisé los documentos, y encontré que en Python 2.1 y posterior el modo predeterminado es pasivo. ¿Con qué servidor estás hablando? ¿Sabes si es compatible con el modo pasivo?

En modo activo (no PASV) el cliente envía un comando PORT que le indica al servidor que inicie la conexión DATOS en ese puerto, lo que requiere que su firewall tenga conocimiento del comando PORT para que pueda reenviar la conexión DATOS entrante - pocos firewalls soportan esto. En modo pasivo, el cliente abre la conexión de DATOS y el servidor la usa (el servidor es "pasivo" al abrir la conexión de datos).

Por si no está usando el modo pasivo, haga un ftp.set_pasv(True) y vea si eso hace la diferencia.

+1

Tiene razón, era un problema con el modo. El servidor con el que estaba tratando de hablar requiere Active. ¡Gracias por la ayuda! – blcArmadillo

10

Si el modo pasivo está fallando por alguna razón intento:

ftp.set_pasv(False) 

Para usar el modo activo.