当我试图列出一个FTP时,我得到了“ConnectionRefusedError”

2024-09-29 23:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的脚本连接到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')

^{pr2}$

我已经用FileZilla测试了连接,它工作得很好,当我试图用python列出目录时,就会出现这个错误。如果我试图通过python检索文件或创建目录,它将起作用,只有“list”命令会出现问题。在

环境:我将Debian9与python3.5一起使用

我已经在我的机器上重新安装了两个Python(2号和3号),但都没用。 另外,我在linuxmint中测试了相同的脚本,它运行得很好。 有人知道这可能是什么吗?谢谢。在

[编辑]

这是连接到同一个FTP服务器时的FileZilla日志(调试模式):

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中发生。在

谢谢!在


Tags: insendresponsetracecommandxxxstateparseresponse
1条回答
网友
1楼 · 发布于 2024-09-29 23:15:44
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)。

相关问题 更多 >

    热门问题