Ftplib ConnectionRefusedError:[Errno 111]连接被拒绝(python 3.5)

Ron*_*anT 3 python ftp ftplib python-3.x

我有一个应该连接到 FTP 的脚本

from ftplib import FTP

with FTP('IP') as ftp:
   ftp.login(user='my user', passwd='my password')
   ftp.cwd('/MY_DIR')
   ftp.dir()
Run Code Online (Sandbox Code Playgroud)

我有一个错误: ConnectionRefusedError: [Errno 111] Connection refused


ftp是带有vsftpd的EC2

pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1048
pasv_address=IP
pasv_addr_resolve=YES
Run Code Online (Sandbox Code Playgroud)

已经尝试过:

该代码可在带或不带 TLS 的其他 FTP 上运行(托管在 1and1、OVH...)


我在 NodeJS 中尝试了这个脚本

const ftpClient = require('ftp-client');

const client = new ftpClient({
   host: "IP",
   port: 21,
   user: "My user", // defaults to "anonymous"
   password: "My password" // defaults to "@anonymous"
});

client.connect(() => {

  client.download('/MY_DIR/file','/tmp/file', (res) => {
        console.log(res)
  })
});
Run Code Online (Sandbox Code Playgroud)

工作得很好,所以我排除了防火墙问题


我尝试过启用 TLS

ssl_enable=YES
require_ssl_reuse=NO
Run Code Online (Sandbox Code Playgroud)

然后 sudo 服务 vsftpd 重新启动

并使用
FTP_TLS代替FTP 但不起作用


我还尝试通过设置禁用被动模式

pasv_enable=NO
Run Code Online (Sandbox Code Playgroud)

然后 sudo service vsftpd restart

ftp.set_pasv(False)

也没用

Ron*_*anT 6

解决方案

使用 filezilla 调试该方法后,发现我们的 FTP 返回 0.0.0.0,尽管我们在/etc/vsftpd.conf

pasv_adress=IP
Run Code Online (Sandbox Code Playgroud)

这篇文章帮助了我们: https: //www.centos.org/forums/viewtopic.php ?t=52408

你必须发表评论

listen_ipv6=YES
Run Code Online (Sandbox Code Playgroud)

并启用

listen=YES
Run Code Online (Sandbox Code Playgroud)

/etc/vsftpd.conf


如果您无法访问 FTP 的 vsftpd.conf,也可以覆盖 ftplib 的 FTP 类

class CustomFTP(ftplib.FTP):

    def makepasv(self):
        if self.af == socket.AF_INET:
            host, port = ftplib.parse227(self.sendcmd('PASV'))
        else:
            host, port = ftplib.parse229(self.sendcmd('EPSV'), self.sock.getpeername())

        if '0.0.0.0' == host:
            """ this ip will be unroutable, we copy Filezilla and return the host instead """
            host = self.host
        return host, port
Run Code Online (Sandbox Code Playgroud)

强制前一个主机'0.0.0.0'发送