2010-07-28 16 views
5

Instalé vsFTP en un cuadro de Debian. Cuando carga manualmente un archivo usando el comando ftp, está bien. es decir, la siguiente sesión funciona:El archivo de carga de FTP funciona de forma manual, pero no funciona con 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. 

(Por favor, señaló que el anterior, he configurado el servidor vsftp para utilizar un puerto no predeterminado, por ejemplo, 5111 por alguna razón)

Ahora, cuando escribo un guión en Pitón para cargar el archivo mediante programación, falló. el error dice 'tiempo de espera', como muestra la siguiente sesión:

 
[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') 

supongo que hay una cierta configuración incorrecta en mi servidor vsftp, pero no puedo entenderlo. Cualquiera puede ayudar?

mi vsftp de configuración es:

 

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 

Respuesta

5

El tiempo de espera no se produce hasta que intenta enviar los datos, por lo que fueron capaces de conectar con el servidor con éxito. La única diferencia que veo es que ftplib usa el modo pasivo por defecto, mientras que su cliente de línea de comandos no parece. Intente hacer

ftp.set_pasv(False) 

antes de iniciar la transferencia y ver qué pasa.

Tenga en cuenta que el modo no pasivo es esencialmente obsoleto porque no se puede utilizar en cortafuegos NAT, por lo que probablemente deba configurar vsFTP para permitir el modo pasivo.

+0

¡Eso funciona! Gracias Jim. ¿Pero por qué el ftplib de python no puede usar el modo pasivo automáticamente? Mi vsFTP está configurado para permitir el modo pasivo de hecho. ¿Podría ser un error de configuración en vsFTP? Edité mi publicación de pregunta y agregué mi vsftpd.conf allí. –

+0

El problema no está en ftplib sino en vsFTP, que por alguna razón no permite el modo pasivo. ¿Estás seguro de que la configuración de vsFTP está en el lugar correcto? –

+0

Sí, Jim, es un problema de la configuración de vsFTP. Finalmente encontré la razón: mi vsFTP se implementa en un NAT. Así que, aunque he configurado la opción vsFTP "pasv_enable = YES", también debería tener que establecer otra opción "pasv_address = my.external.ip.address". ¡Después de eso, todo está bien! Gracias, gracias a la cálida comunidad! –

Cuestiones relacionadas