#python-3.x #ftp #ftp-server
#python-3.x #ftp #ftp-сервер
Вопрос:
Я создал 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. Это не вопрос программирования. Не имеет значения, что вы сами создали свой FTP-сервер на Python. Вы делаете его доступным для внешней сети таким же образом, как и любой другой сторонний FTP-сервер — путем настройки брандмауэра и NAT.
Ответ №1:
(Из того, что вы говорите, я предполагаю, что это не работает, только если вы подключаетесь к удаленной сети.)
Поскольку у вас проблема с подключением, похоже, что проблема вызвана сетью. С точки зрения программирования не должно иметь значения, подключаетесь ли вы к IP в своей локальной сети или нет.
Проверьте эти возможные проблемы:
- Сервер находится за NAT: типичный потребительский маршрутизатор выполняет преобразование сетевых адресов между общедоступными и частными адресами. Это полезно, когда ваш провайдер предоставляет вам один IP, но вы хотите использовать несколько устройств. Когда обычный домашний маршрутизатор видит пакет с локального компьютера куда-либо в Интернете, он меняет свой исходный IP на IP, предоставленный вашим провайдером, при необходимости изменяет исходный порт и запоминает это соединение. Маршрутизатор может позже использовать эту сохраненную информацию, чтобы перевести все обратно, когда придет ответ. В этом случае вы можете создавать соединения только изнутри локальной сети. Если вы хотите получать соединение из Интернета, вам придется явно указать, какой компьютер в локальной сети должен получать это соединение. Найдите «перенаправление портов» или «виртуальные серверы» или что-то подобное в настройках маршрутизаторов. Некоторые протоколы (например, FTP) имеют проблемы с NATs, вашему маршрутизатору потребуется поддерживать эти прикладные протоколы.
- Где-то в сети есть брандмауэр, или ОС на стороне сервера не позволяет использовать низкие номера портов (это менее вероятно. Вероятно, вы получите какую-то ошибку на стороне сервера).
Комментарии:
1. Какой сервер мне назначить для прослушивания? ‘0.0.0.0’? (также на какой мне установить свой маскарадный адрес?)
2. Если у вас единый интерфейс, должно быть нормально, если вы используете «0.0.0.0» в качестве параметра. В этом примере не указан адрес. (Маскарадный адрес должен быть адресом, предоставляемым клиентам, поэтому в вашем случае это, вероятно, должен быть публичный IP, но я не уверен, что это решит вашу проблему.) Я не уверен, как маршрутизатор на стороне сервера будет обрабатывать пассивный ftp. Некоторые домашние устройства проверяют команды ftp на наличие порта, а затем автоматически открывают его. Разницу между пассивным и активным ftp смотрите по этой ссылке.