Domanda
Sto cercando di utilizzare ftplib per ottenere un elenco di file e scaricare nuovi file dal mio ultimo assegno. Il codice che sto cercando di eseguire finora è:
#!/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()
Ogni volta che corro questo timeout quando cerco di recuperare l'elenco. Tutte le idee?
Soluzione
Molto probabilmente un conflitto tra la modalità attiva e passiva. Assicurarsi che una delle seguenti condizioni:
- I server supporta modalità PASV e il client è impostazione della modalità PASV
- Se il server non supporta la modalità passiva, quindi il firewall deve supportare trasferimenti FTP in modalità attiva.
EDIT: ho guardato la documentazione, e ha scoperto che in Python 2.1 e versioni successive il valore predefinito è la modalità passiva. Quale server stai parlando, e di non si sa se supporta la modalità passiva?
In modalità attiva (non PASV) il client invia un comando PORT dire al server per avviare la connessione DATI su quella porta, che richiede il firewall essere consapevoli del comando PORT in modo che possa inoltrare la connessione di dati in entrata a voi - - alcuni firewall supportano questa. Nella modalità passiva il client apre la connessione dati e il server utilizza (il server è "passivo" ad aprire la connessione dati).
Nel caso in cui non si sta usando la modalità passiva, fare un ftp.set_pasv(True)
e vedere se questo fa la differenza.
Altri suggerimenti
Se la modalità passiva non riesce per qualche motivo try:
ftp.set_pasv(False)
per utilizzare la modalità attiva.