2010-07-28 4 views
5

J'ai installé vsFTP dans une boîte Debian. Lorsque vous téléchargez manuellement un fichier à l'aide de la commande ftp, tout va bien. à savoir, la session suivante fonctionne:Le fichier de téléchargement FTP fonctionne manuellement, mais échoue en utilisant Python ftplib

 
[email protected]:~$ ftp xxx.xxx.xxx.xxx 5111 
Connected to xxx.xxx.xxx.xxx. 
220 Hello,Welcom to my FTP server. 
Name (xxx.xxx.xxx.xxx:john): ftpuser 
331 Please specify the password. 
Password: 
230 Login successful. 
Remote system type is UNIX. 
Using binary mode to transfer files. 
ftp> put st.zip 
local: st.zip remote: st.zip 
200 PORT command successful. Consider using PASV. 
150 Ok to send data. 
226 File receive OK. 
12773 bytes sent in 0.00 secs (277191.8 kB/s) 
ftp> 221 Goodbye. 

(S'il vous plaît noter que, comme ci-dessus, j'ai configuré serveur vsftp d'utiliser un port par défaut, par exemple 5111 pour une raison quelconque)

Maintenant, quand j'écris un script Python pour télécharger le fichier par programme, il a échoué. l'erreur dit « le temps », comme la session suivante montre:

 
[email protected]:~$ ipython 
Python 2.5.2 (r252:60911, Jan 24 2010, 14:53:14) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.8.4 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

In [1]: import ftplib 

In [2]: ftp=ftplib.FTP()              

In [3]: ftp.connect('xxx.xxx.xxx.xxx','5111')         
Out[3]: "220 Hello,Welcom to my FTP server." 

In [4]: ftp.login('ftpuser','ftpuser')        
Out[4]: '230 Login successful.' 

In [5]: f=open('st.zip','rb')        

In [6]: ftp.storbinary('STOR %s' % 'my_ftp_file.zip', f)        
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 

... 

/usr/lib/python2.5/ftplib.pyc in ntransfercmd(self, cmd, rest) 
    322    af, socktype, proto, canon, sa = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)[0] 
    323    conn = socket.socket(af, socktype, proto) 
--> 324    conn.connect(sa) 
    325    if rest is not None: 
    326     self.sendcmd("REST %s" % rest) 

/usr/lib/python2.5/socket.pyc in connect(self, *args) 

error: (110, 'Connection timed out') 

Je crois qu'il ya une mauvaise config dans mon serveur vsftpd, mais ne peut pas comprendre. Quelqu'un peut-il aider?

ma config vsftp est:

 

listen=YES 

connect_from_port_20=YES 
listen_port=5111 
ftp_data_port=5110 

# Passive FTP mode allowed 
pasv_enable=YES 
pasv_min_port=5300 
pasv_max_port=5400 

max_per_ip=2 

Répondre

5

Le délai d'attente ne se produit pas jusqu'à ce que vous essayez d'envoyer les données, de sorte que vous étiez en mesure de se connecter au serveur avec succès. La seule différence que je vois est que ftplib utilise le mode passif par défaut, alors que votre client en ligne de commande ne semble pas. Essayez de faire

ftp.set_pasv(False) 

avant d'initier le transfert et de voir ce qui se passe. Notez que le mode non passif est essentiellement obsolète car il ne peut pas être utilisé sur les pare-feu NAT. Vous devez donc probablement configurer vsFTP pour autoriser le mode passif.

+0

Ça marche! Merci Jim. Mais pourquoi le python ftplib ne peut pas utiliser le mode pasive automatiquement? Mon vsFTP est configuré pour permettre le mode passif en effet. Serait-ce une erreur de configuration dans vsFTP? J'ai édité ma question post et y ai ajouté mon vsftpd.conf. –

+0

Le problème n'est pas dans ftplib mais dans vsFTP, qui, pour une raison quelconque, n'autorise pas le mode passif. Etes-vous sûr que la configuration de vsFTP est au bon endroit? –

+0

Oui, Jim, C'est un problème de la config vsFTP. Finalement, j'ai trouvé la raison: mon vsFTP est déployé dans un NAT. Donc, même si j'ai défini l'option vsFTP "pasv_enable = YES", je devrais également définir une autre option "pasv_address = mon.external.ip.address". Après ça, tout va bien! Merci, merci à la communauté chaleureuse! –