Ftplib ConnectionRefusedError: [Errno 111] Соединение отклонено (python 3.5) - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть скрипт, который должен подключаться к FTP

from ftplib import FTP

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

У меня ошибка: ConnectionRefusedError: [Errno 111] Connection refused


ftp - это EC2 с vsftpd

pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1048
pasv_address=IP
pasv_addr_resolve=YES

Уже пробовал:

Код работает на других FTP с TLS и без него (размещен на 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)
  })
});

Прекрасно работает, поэтому я исключаю проблему с брандмауэром


Я попытался включить TLS

ssl_enable=YES
require_ssl_reuse=NO

, то sudo service vsftpd restart

и используйте
FTP_TLS вместо FTP но не сработало


Также я попытался отключить пассивный режим, установив

pasv_enable=NO

, то sudo service vsftpd restart

и ftp.set_pasv(False)

тоже не работал

1 Ответ

0 голосов
/ 27 апреля 2018

Решение

После использования filezilla для отладки метода, оказалось, что наш FTP вернул 0.0.0.0, несмотря на то, что мы определили в /etc/vsftpd.conf

pasv_adress=IP

нам помог этот пост: https://www.centos.org/forums/viewtopic.php?t=52408

Вы должны комментировать

listen_ipv6=YES

и включить

listen=YES

в /etc/vsftpd.conf


Также вы можете переопределить класс FTP ftplib, если у вас нет доступа к vsftpd.conf 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

для принудительного запуска предыдущего хоста, если '0.0.0.0' отправлено

...