2017-10-19 88 views
0

我有一个简单的脚本来连接到FTP服务器:我“ConnectionRefusedError”当我尝试列出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() 

是蛮好的连接,错误发生的事情,每次我尝试使用命令列出FTP目录,如NLSTDIR甚至retrlines( 'LIST')

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 

我已经测试了康恩与FileZilla和它工作正常,这个错误只是当我尝试用python列出目录时发生。如果我尝试通过python检索文件或创建目录,它将起作用,只有提供该问题的“list”命令。

环境:我使用Debian 9 python3.5

我已经重新安装了两个蟒蛇(2,3)在我的机器,但没有奏效。 另外,我在Linux Mint中测试了相同的脚本,并且它工作正常。 有人可能知道这可能是什么?谢谢。

[编辑]

这是FileZilla的日志(调试模式),当我连接到同一个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) 

只是提醒的是,该代码是在另一个机器工作正常,当我尝试列出FTP中的任何目录时,问题只发生在Debian中。

谢谢!

+0

你可以通过'filezilla'检查你是否使用'ftp'或'sftp'?如果'sftp'然后尝试使用'pysftp'并查看它是否有效。 –

+0

这是一个普通的FTP服务器。脚本在我的Mint机器上工作,这个奇怪的错误只出现在Debian中。谢谢! –

+0

这可能是一个防火墙问题。 – Barmar

回答

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. 

您的FTP服务器配置错误。或者宁可忍受vsftpd returns 0,0,0,0 in response to PASV中描述的vsftpd错误。

虽然FileZilla可以启发式解决方法,许多其他FTP客户端和库将(正确)失败。

我无法想象你的代码如何工作“其他机器”。除非它们和FTP服务器网络之间的防火墙/ NAT修复了(不太可能)227响应。 如果您想进一步调查(可能不值得),我们需要您的程序的FTP会话的日志文件(例如使用服务器端日志的Wireshark)。

相关问题