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
¡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í. –
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? –
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! –