Как мне сделать FTP-сервер Python PUBLIC? - PullRequest
2 голосов
/ 29 марта 2019

Я создал FTP-сервер с Pyftpdlib, и я хотел бы иметь возможность подключиться к серверу из другой страны / IP-адреса, и я попытался загрузить свой скрипт (в форме exe) другу в другой частистрана, и я не мог соединиться (простой тайм-аут / недействительный ошибка).Как мне подключиться к ftp-серверу, который не находится рядом со мной?

Сервер

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import requests

import mysql.connector
sqlpass = "THIS ISNT THE PASSWORD"

def ftp_main():
    mydb = mysql.connector.connect(
        host="remotemysql.com",
        port="3306",
        user="NOT TELLING",
        passwd=sqlpass,
        database="NO THANKS"
    )
    mycursor = mydb.cursor()

    mycursor.execute("SELECT Username, Password FROM NO-THANKS")
    myresult = mycursor.fetchall()
    Username, Password = myresult[0]
    print(Username + " " + Password)


    authorizer = DummyAuthorizer()


    authorizer.add_user(Username, Password, 'C:/', perm='elradfmwMT')
    authorizer.add_anonymous('C:/')


    handler = FTPHandler
    handler.authorizer = authorizer

    handler.banner = "Test Banner"



    # Instantiate FTP server class and listen on 0.0.0.0:2121
    address = ('0.0.0.0', 21)
    server = FTPServer(address, handler)


    # start ftp server
    server.serve_forever()


ftp_main()

Клиент

from ftplib import FTP

ftp = FTP('104.193.20.211')
ftp.login("user", "pass")

ftp.retrlines('LIST')
ftp.cwd("Users/TEST/Desktop")
ftp.retrlines('LIST')

getfile = 'test1.txt'
command = 'RETR'

ftp.retrbinary(command + " " + getfile, open('test1.txt', 'wb').write)

Я ожидаю подключения и возможности перечисления файлов, но я просто не могу подключиться.

1 Ответ

2 голосов
/ 29 марта 2019

(Исходя из того, что вы говорите, я предполагаю, что он не работает, только если вы подключаетесь к удаленной сети.)

Поскольку у вас есть проблемы с подключением, кажется, что проблема вызвана сетью.С точки зрения программирования, не должно иметь значения, подключаетесь ли вы к IP в локальной сети или нет.

Проверьте следующие возможные проблемы:

  • Сервер отстает NAT : Типичный потребительский маршрутизатор выполняет преобразование сетевых адресов между публичными и частными адресами.Это полезно, когда ваш провайдер предоставляет вам один IP, но вы хотите использовать несколько устройств.Когда обычный домашний маршрутизатор видит пакет с локального компьютера и где-то в Интернете, он меняет исходный IP на IP, предоставленный вашим провайдером, меняет исходный порт , если необходимо, и запоминает это соединение.Позже маршрутизатор может использовать эту запомненную информацию для перевода всего обратно, когда приходит ответ.В этом случае вы можете создавать соединения только изнутри локальной сети.Если вы хотите получить соединение из Интернета, вам нужно будет явно указать, какой компьютер в локальной сети должен получать это соединение.Ищите «переадресация портов» или «виртуальные серверы» или что-то подобное в настройках маршрутизаторов.Некоторые протоколы (например, FTP) имеют проблемы с NAT, ваш маршрутизатор должен будет поддерживать эти протоколы приложений.
  • Где-то в сети есть брандмауэр, или ОС на стороне сервера не позволяет использоватьнизкие номера портов (это менее вероятно. Возможно, вы получите ошибку на стороне сервера).
...