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
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.