如何制作python FTP服务器PUBLIC?

时间:2019-03-28 23:37:32

标签: python-3.x ftp ftp-server

我已经使用Pyftpdlib制作了一个FTP服务器,并且希望能够从另一个国家/ 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 个答案:

答案 0 :(得分:2)

(根据您的说法,我认为仅当您连接到远程网络时它才起作用。)

由于连接有问题,看来问题是由网络引起的。从编程的角度来看,是否连接到本地网络上的IP都没关系。

检查这些可能的问题:

  • 服务器位于NAT之后:典型的消费者路由器在公用地址和专用地址之间执行网络地址转换。当您的ISP为您提供单个IP但您想使用多个设备时,此功能很有用。当典型的家用路由器看到从本地计算机到Internet某个地方的数据包时,会将其源IP 更改为ISP提供的IP,并在必要时更改源端口,并记住该连接。路由器以后可以使用此记住的信息在答复到达时将所有内容转换回去。在这种情况下,您只能从本地网络内部创建连接。如果要接收来自Internet的连接,则必须明确设置本地网络上的哪台计算机应接收此连接。搜索“端口转发”或“虚拟服务器”或路由器设置中的类似内容。某些协议(例如FTP)具有problems和NAT,您的路由器将需要支持这些应用程序协议。
  • 网络上有防火墙,或者服务器端的操作系统不允许使用低端口号(这种可能性较小。在服务器端可能会出现一些错误)。