No se puede enumerar el directorio FTP mediante ftplib, pero el cliente FTP funciona

Estoy intentando conectarme a un FTP pero no puedo ejecutar ningún comando.

ftp_server = ip
ftp_username = username
ftp_password = password

ftp = ftplib.FTP(ftp_server)
ftp.login(ftp_username, ftp_password)
'230 Logged on'

ftp.nlst()

El arroja este error:ftp.nlst

Error:
[WinError 10060] Error en un intento de conexión porque la parte conectada no respondió correctamente después de un período de tiempo o se produjo un error en la conexión establecida porque el host conectado no respondió


He probado la conexión usando FileZilla (ejecutándose en la misma máquina) y funciona bien.

Este es el registro de FileZilla:

Status: Connection established, waiting for welcome message...
Status: Insecure server, it does not support FTP over TLS.
Status: Logged in Status: Retrieving directory listing...
Status: Server sent passive reply with unroutable address. Using server address instead.
Status: Directory listing of "/" successful
Respuestas:1 Respuesta 1
Tiempo:hace 3 años, 5 meses
Última modificación:hace 22 días

Solución

Estado: Respuesta pasiva enviada por el servidor con dirección no enrutable

Lo anterior significa que el servidor FTP está mal configurado. Envía su IP de red interna a una red externa (al cliente – FileZilla o Python ftplib), donde no es válida. FileZilla puede detectar eso y recurrir automáticamente a la dirección IP original del servidor.

Python ftplib no realiza este tipo de detección.

Debe reparar su servidor FTP para devolver la dirección IP correcta.


Si no es factible arreglar el servidor (no es suyo y el administrador no coopera), puede hacer que ftplib ignore la dirección IP devuelta (no válida) y use la dirección original en su lugar anulando :FTP.makepasv

class SmartFTP(FTP):
    def makepasv(self):
        invalidhost, port = super(SmartFTP, self).makepasv()
        return self.host, port

ftp = SmartFTP(ftp_server)

# the rest of the code is the same

En las versiones recientes de Python (3.6 y posteriores), ftplib no considera la dirección IP en la respuesta PASV por sí sola.


Otra solución puede ser usar IPv6. Consulte Conexión FTPS de Python 3.8.5.

Para un problema diferente con consecuencias similares, consulte vsftpd devuelve 0,0,0,0 en respuesta a PASV.

Otras respuestas

Deja un comentario