2017-10-19 22 views
0

J'ai un script simple pour se connecter à un serveur FTP:j'ai eu « ConnectionRefusedError » lorsque je tente de lister un serveur FTP

from ftplib import FTP 

# Here is fine 
ftp = FTP(host='') 
ftp.login(user='', passwd='') 
ftp.cwd('/test/') 

# Here I got the error 
ftp.nlst() 

La connexion est très bien, l'erreur se produit chaque fois que je essayez d'utiliser les commandes pour répertorier le répertoire FTP, comme nlst, dir ou même retrlines ('LISTE'):

230 Login successful. 
250 Directory successfully changed. 
Traceback (most recent call last): 
    File "scripts/test.py", line 6, in <module> 
    print(a.nlst()) 
    File "/usr/lib/python3.5/ftplib.py", line 558, in nlst 
    self.retrlines(cmd, files.append) 
    File "/usr/lib/python3.5/ftplib.py", line 467, in retrlines 
    with self.transfercmd(cmd) as conn, \ 
    File "/usr/lib/python3.5/ftplib.py", line 398, in transfercmd 
    return self.ntransfercmd(cmd, rest)[0] 
    File "/usr/lib/python3.5/ftplib.py", line 360, in ntransfercmd 
    source_address=self.source_address) 
    File "/usr/lib/python3.5/socket.py", line 712, in create_connection 
    raise err 
    File "/usr/lib/python3.5/socket.py", line 703, in create_connection 
    sock.connect(sa) 
ConnectionRefusedError: [Errno 111] Connection refused 

Je l'ai déjà testé la conn ection avec FileZilla et ça marche bien, cette erreur arrive quand j'essaye de lister le répertoire avec python. Si j'essaie de récupérer des fichiers ou de créer des répertoires via python cela fonctionnera, seulement les commandes "list" qui donnent le problème.

Environnement: J'utilise debian 9 avec python3.5

Je l'ai déjà réinstallé les deux pythons (2 et 3) dans ma machine, mais n'a pas travaillé. En outre, j'ai testé le même script dans une Monnaie Linux que j'ai et cela fonctionne très bien. Quelqu'un pourrait-il savoir ce que cela pourrait être? Merci.

[EDIT]

Ceci est le journal FileZilla (mode de débogage) lorsque je me connecte au même serveur FTP:

Trace: CControlSocket::SendNextCommand() 
Trace: CFtpLogonOpData::Send() in state 0 
Status: Connecting to XX.XXX.XXX.XXX:21... 
Status: Connection established, waiting for welcome message... 
Trace: CFtpControlSocket::OnReceive() 
Response: 220 (vsFTPd 3.0.3) 
Trace: CFtpLogonOpData::ParseResponse() in state 1 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpLogonOpData::Send() in state 2 
Command: AUTH TLS 
Trace: CFtpControlSocket::OnReceive() 
Response: 530 Please login with USER and PASS. 
Trace: CFtpLogonOpData::ParseResponse() in state 2 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpLogonOpData::Send() in state 3 
Command: AUTH SSL 
Trace: CFtpControlSocket::OnReceive() 
Response: 530 Please login with USER and PASS. 
Trace: CFtpLogonOpData::ParseResponse() in state 3 
Status: Insecure server, it does not support FTP over TLS. 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpLogonOpData::Send() in state 5 
Command: USER xxxxxx 
Trace: CFtpControlSocket::OnReceive() 
Response: 331 Please specify the password. 
Trace: CFtpLogonOpData::ParseResponse() in state 5 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpLogonOpData::Send() in state 5 
Command: PASS ************ 
Trace: CFtpControlSocket::OnReceive() 
Response: 230 Login successful. 
Trace: CFtpLogonOpData::ParseResponse() in state 5 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpLogonOpData::Send() in state 6 
Command: SYST 
Trace: CFtpControlSocket::OnReceive() 
Response: 215 UNIX Type: L8 
Trace: CFtpLogonOpData::ParseResponse() in state 6 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpLogonOpData::Send() in state 7 
Command: FEAT 
Trace: CFtpControlSocket::OnReceive() 
Response: 211-Features: 
Response: EPRT 
Response: EPSV 
Response: MDTM 
Response: PASV 
Response: REST STREAM 
Response: SIZE 
Response: TVFS 
Response: 211 End 
Trace: CFtpLogonOpData::ParseResponse() in state 7 
Status: Server does not support non-ASCII characters. 
Status: Logged in 
Trace: Measured latency of 40 ms 
Trace: CFtpControlSocket::ResetOperation(0) 
Trace: CControlSocket::ResetOperation(0) 
Trace: CFileZillaEnginePrivate::ResetOperation(0) 
Status: Retrieving directory listing... 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpListOpData::ListSend() in state 0 
Trace: CFtpChangeDirOpData::Send() in state 0 
Trace: CFtpChangeDirOpData::Send() in state 1 
Command: PWD 
Trace: CFtpControlSocket::OnReceive() 
Response: 257 "/" is the current directory 
Trace: CFtpChangeDirOpData::ParseResponse() in state 1 
Trace: CFtpControlSocket::ResetOperation(0) 
Trace: CControlSocket::ResetOperation(0) 
Trace: CControlSocket::ParseSubcommandResult(0) 
Trace: CFtpListOpData::SubcommandResult() in state 1 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpListOpData::ListSend() in state 2 
Trace: CFtpRawTransferOpData::Send() in state 1 
Command: TYPE I 
Trace: CFtpControlSocket::OnReceive() 
Response: 200 Switching to Binary mode. 
Trace: CFtpRawTransferOpData::ParseResponse() in state 1 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpRawTransferOpData::Send() in state 2 
Command: PASV 
Trace: CFtpControlSocket::OnReceive() 
Response: 227 Entering Passive Mode (0,0,0,0,195,59). 
Trace: CFtpRawTransferOpData::ParseResponse() in state 2 
Status: Server sent passive reply with unroutable address. Using server address instead. 
Trace: Reply: 0.0.0.0, peer: XX.XXX.XXX.XXX 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpRawTransferOpData::Send() in state 4 
Trace: Binding data connection source IP to control connection source IP XX.XXX.XXX.XXX 
Command: LIST 
Trace: CTransferSocket::OnConnect 
Trace: CFtpControlSocket::OnReceive() 
Response: 150 Here comes the directory listing. 
Trace: CFtpRawTransferOpData::ParseResponse() in state 4 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpRawTransferOpData::Send() in state 5 
Trace: CTransferSocket::OnReceive(), m_transferMode=0 
Trace: CTransferSocket::TransferEnd(1) 
Trace: CFtpControlSocket::TransferEnd() 
Trace: CFtpControlSocket::OnReceive() 
Response: 226 Directory send OK. 
Trace: CFtpRawTransferOpData::ParseResponse() in state 7 
Trace: CFtpControlSocket::ResetOperation(0) 
Trace: CControlSocket::ResetOperation(0) 
Trace: CControlSocket::ParseSubcommandResult(0) 
Trace: CFtpListOpData::SubcommandResult() in state 3 
Trace: CFtpControlSocket::ResetOperation(0) 
Trace: CControlSocket::ResetOperation(0) 
Status: Directory listing of "/" successful 
Trace: CFileZillaEnginePrivate::ResetOperation(0) 
Status: Retrieving directory listing of "/test"... 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpListOpData::ListSend() in state 0 
Trace: CFtpChangeDirOpData::Send() in state 0 
Trace: CFtpChangeDirOpData::Send() in state 4 
Command: CWD files 
Trace: CFtpControlSocket::OnReceive() 
Response: 250 Directory successfully changed. 
Trace: CFtpChangeDirOpData::ParseResponse() in state 4 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpChangeDirOpData::Send() in state 5 
Command: PWD 
Trace: CFtpControlSocket::OnReceive() 
Response: 257 "/test" is the current directory 
Trace: CFtpChangeDirOpData::ParseResponse() in state 5 
Trace: CFtpControlSocket::ResetOperation(0) 
Trace: CControlSocket::ResetOperation(0) 
Trace: CControlSocket::ParseSubcommandResult(0) 
Trace: CFtpListOpData::SubcommandResult() in state 1 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpListOpData::ListSend() in state 2 
Trace: CFtpRawTransferOpData::Send() in state 2 
Command: PASV 
Trace: CFtpControlSocket::OnReceive() 
Response: 227 Entering Passive Mode (0,0,0,0,167,55). 
Trace: CFtpRawTransferOpData::ParseResponse() in state 2 
Status: Server sent passive reply with unroutable address. Using server address instead. 
Trace: Reply: 0.0.0.0, peer: XX.XXX.XXX.XXX 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpRawTransferOpData::Send() in state 4 
Trace: Binding data connection source IP to control connection source IP XX.XXX.XXX.XXX 
Command: LIST 
Trace: CTransferSocket::OnConnect 
Trace: CFtpControlSocket::OnReceive() 
Response: 150 Here comes the directory listing. 
Trace: CFtpRawTransferOpData::ParseResponse() in state 4 
Trace: CControlSocket::SendNextCommand() 
Trace: CFtpRawTransferOpData::Send() in state 5 
Trace: CTransferSocket::OnClose(0) 
Trace: CTransferSocket::TransferEnd(1) 
Trace: CFtpControlSocket::TransferEnd() 
Trace: CFtpControlSocket::OnReceive() 
Response: 226 Directory send OK. 
Trace: CFtpRawTransferOpData::ParseResponse() in state 7 
Trace: CFtpControlSocket::ResetOperation(0) 
Trace: CControlSocket::ResetOperation(0) 
Trace: CControlSocket::ParseSubcommandResult(0) 
Trace: CFtpListOpData::SubcommandResult() in state 3 
Trace: CFtpControlSocket::ResetOperation(0) 
Trace: CControlSocket::ResetOperation(0) 
Status: Directory listing of "/test" successful 
Trace: CFileZillaEnginePrivate::ResetOperation(0) 

Tout en rappelant que le code fonctionne bien dans une autre machine, le problème ne se produit que dans Debian quand j'essaye de lister n'importe quel répertoire dans le FTP.

Merci!

+0

Pouvez-vous vérifier si vous utilisez 'ftp' ou' sftp' via 'filezilla'? si 'sftp' alors essayez d'utiliser' pysftp' et voyez si cela fonctionne. –

+0

C'est un serveur FTP régulier. Le script fonctionne dans ma machine Mint, cette erreur bizarre n'apparaît que dans Debian. Merci! –

+0

Il s'agit peut-être d'un problème de pare-feu. – Barmar

Répondre

0
Command: PASV 
Response: 227 Entering Passive Mode (0,0,0,0,195,59). 
Status: Server sent passive reply with unroutable address. Using server address instead. 

Votre serveur FTP est mal configuré. Ou souffre plutôt d'un bug vsftpd décrit dans vsftpd returns 0,0,0,0 in response to PASV. Bien que FileZilla puisse heureusement contourner ce problème, de nombreux autres clients et bibliothèques FTP échoueront (à juste titre).

Je ne peux pas imaginer comment votre code peut fonctionner sur "autres machines". À moins qu'un pare-feu/NAT entre leur et les réseaux de serveur FTP corrigent la réponse 227 (peu probable). Si vous souhaitez approfondir cette question (cela ne vaut probablement pas le coup), nous avons besoin de fichiers journaux des sessions FTP de votre programme (par exemple, en utilisant Wireshark des journaux côté serveur).