Dieser Artikel stellt hauptsächlich die Methode zur Implementierung eines FTP-Servers in Python vor. Jetzt werde ich ihn mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor, um einen Blick darauf zu werfen
Aktiver Modus und passiver Modus des FTP-Dienstes
Bevor wir beginnen, sprechen wir über den aktiven Modus und den passiven Modus von FTP. Der Unterschied zwischen ihnen kann durch zwei Bilder deutlicher dargestellt werden:
Aktiver Modus:
Arbeitsprozess im aktiven Modus:
1. Der Client initiiert eine Verbindung zum Server-Port 21 über einen zufälligen nicht privilegierten Port N, der größer als 1024 ist.
2 Der Client beginnt, auf Port N+ zu lauschen 1;
3. Der Server stellt über Port 20 eine aktive Verbindung zum N+1-Port des Clients her.
Vorteile des aktiven Modus:
Die Serverkonfiguration ist einfach, was der Serversicherheitsverwaltung zuträglich ist. Der Server muss nur Port 21 öffnen
Nachteile des aktiven Modus:
Wenn auf dem Client eine Firewall aktiviert ist oder sich der Client im Intranet (hinter einem NAT-Gateway) befindet, wird die Verbindung vom Server zum Client-Port initiiert kann fehlschlagen
Passiver Modus:
Passiver Modus-Arbeitsprozess:
1 Der Client stellt über a eine Verbindung zu Port 21 des Servers her Zufälliger nichtprivilegierter Port
2. Der Server öffnet einen nichtprivilegierten Port als passiven Port und gibt ihn an den Client zurück
3 Der Client verbindet sich aktiv mit dem passiven Port des Servers über den unprivilegierten Port + 1 Port
Nachteile des passiven Modus:
Die Verwaltung der Serverkonfiguration ist etwas kompliziert, was der Sicherheit nicht zuträglich ist. Der Server muss zufällige High-Level-Ports öffnen, damit Clients eine Verbindung herstellen können Die meisten FTP-Dienstprogramme können den passiven Portbereich manuell konfigurieren
Passiv Vorteile des Modus: Es gibt keine Anforderungen an die Client-Netzwerkumgebung
Nachdem Sie FTP verstanden haben, beginnen Sie mit der Verwendung von Python zur Implementierung von FTP-Diensten
Vorbereitungsarbeiten
Diese verwendete Python-Version: Python 3.4.3
Installieren Sie das Modul pyftpdlib
pip3 install pyftpdlib
Erstellen Sie die Codedatei FtpServer.py
Code
Implementieren Sie eine einfache lokale Überprüfung
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) authorizer.add_user('user', '12345', '/home/', perm='elradfmw') #添加匿名用户 只需要路径 authorizer.add_anonymous('/home/huangxm') #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #监听ip 和 端口,因为linux里非root用户无法使用21端口,所以我使用了2121端口 server = FTPServer(('192.168.0.108', 2121), handler) #开始服务 server.serve_forever()
Dienst aktivieren
$python FtpServer.py
Testen Sie es:
Geben Sie ein falsches Passwort ein und versuchen Sie es:
Verifizierung fehlgeschlagen und Anmeldung nicht möglich.
Aber das scheint der aktive FTP-Modus zu sein. Wie implementiert man den passiven Modus?
Fügen Sie passive Ports über den folgenden Code hinzu:
handler.passive_ports = range(2000, 2333)
Vollständiger Code:
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) authorizer.add_user('user', '12345', '/home/', perm='elradfmw') #添加匿名用户 只需要路径 authorizer.add_anonymous('/home/huangxm') #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #添加被动端口范围 handler.passive_ports = range(2000, 2333) #监听ip 和 端口 server = FTPServer(('192.168.0.108', 2121), handler) #开始服务 server.serve_forever()
Aktivieren Sie den Dienst und Sie können die Informationen zum passiven Port sehen:
$ python FtpServer.py [I 2017-01-11 15:18:37] >>> starting FTP server on 192.168.0.108:2121, pid=46296 <<< [I 2017-01-11 15:18:37] concurrency model: async [I 2017-01-11 15:18:37] masquerade (NAT) address: None [I 2017-01-11 15:18:37] passive ports: 2000->2332
FTP-Benutzerverwaltung:
Durch die obige Vorgehensweise kann der FTP-Server bereits normal funktionieren, aber was ist, wenn viele FTP-Benutzer benötigt werden? Sollte jeder Benutzer es einmal schreiben?
Tatsächlich können wir eine Benutzerdatei user.py
#用户名 密码 权限 目录 # root 12345 elradfmwM /home huangxm 12345 elradfmwM /home
definieren und dann die Datei durchlaufen und Zeilen hinzufügen, die nicht mit # beginnen zum user_list Medium
Vollständiger Code:
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer def get_user(userfile): #定义一个用户列表 user_list = [] with open(userfile) as f: for line in f: print(len(line.split())) if not line.startswith('#') and line: if len(line.split()) == 4: user_list.append(line.split()) else: print("user.conf配置错误") return user_list #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) #authorizer.add_user('user', '12345', '/home/', perm='elradfmw') user_list = get_user('/home/huangxm/test_py/FtpServer/user.conf') for user in user_list: name, passwd, permit, homedir = user try: authorizer.add_user(name, passwd, homedir, perm=permit) except Exception as e: print(e) #添加匿名用户 只需要路径 authorizer.add_anonymous('/home/huangxm') #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #添加被动端口范围 handler.passive_ports = range(2000, 2333) #监听ip 和 端口 server = FTPServer(('192.168.0.108', 2121), handler) #开始服务 server.serve_forever()
Zu diesem Zeitpunkt ist der FTP-Dienst abgeschlossen.
Standardisieren Sie den Code
Erstellen Sie zunächst das Conf-Verzeichnis zum Speichern von Settings.py und User.py
Verzeichnisstruktur (machen Sie sich keine Sorgen darüber diejenigen im Cache):
setting.py
ip = '0.0.0.0' port = '2121' #上传速度 300kb/s max_upload = 300 * 1024 #下载速度 300kb/s max_download = 300 * 1024 #最大连接数 max_cons = 150 #最多IP数 max_per_ip = 10 #被动端口范围,注意被动端口数量要比最大IP数多,否则可能出现无法连接的情况 passive_ports = (2000, 2200) #是否开启匿名访问 on|off enable_anonymous = 'off' #匿名用户目录 anonymous_path = '/home/huangxm' #是否开启日志 on|off enable_logging = 'off' #日志文件 loging_name = 'pyftp.log' #欢迎信息 welcome_msg = 'Welcome to my ftp'
user.py
#用户名 密码 权限 目录 #root 12345 elradfmwM /home/ huangxm 12345 elradfmwM /home/ test 12345 elradfmwM /home/huangxm
FtpServer.py
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler from pyftpdlib.servers import FTPServer from conf import settings import logging def get_user(userfile): #定义一个用户列表 user_list = [] with open(userfile) as f: for line in f: if not line.startswith('#') and line: if len(line.split()) == 4: user_list.append(line.split()) else: print("user.conf配置错误") return user_list def ftp_server(): #实例化虚拟用户,这是FTP验证首要条件 authorizer = DummyAuthorizer() #添加用户权限和路径,括号内的参数是(用户名, 密码, 用户目录, 权限) #authorizer.add_user('user', '12345', '/home/', perm='elradfmw') user_list = get_user('conf/user.py') for user in user_list: name, passwd, permit, homedir = user try: authorizer.add_user(name, passwd, homedir, perm=permit) except Exception as e: print(e) #添加匿名用户 只需要路径 if settings.enable_anonymous == 'on': authorizer.add_anonymous(settings.anonymous_path) #下载上传速度设置 dtp_handler = ThrottledDTPHandler dtp_handler.read_limit = settings.max_download dtp_handler.write_limit = settings.max_upload #初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer #日志记录 if settings.enable_logging == 'on': logging.basicConfig(filename=settings.loging_name, level=logging.INFO) #欢迎信息 handler.banner = settings.welcome_msg #添加被动端口范围 handler.passive_ports = range(settings.passive_ports[0], settings.passive_ports[1]) #监听ip 和 端口 server = FTPServer((settings.ip, settings.port), handler) #最大连接数 server.max_cons = settings.max_cons server.max_cons_per_ip = settings.max_per_ip #开始服务 print('开始服务') server.serve_forever() if __name__ == "__main__": ftp_server()
Lassen Sie uns abschließend über das Berechtigungsproblem sprechen
Leseberechtigung :
e | 改变文件目录 |
l | 列出文件 |
r | 从服务器接收文件 |
Schreiberlaubnis:
a | 文件上传 |
d | 删除文件 |
f | 文件重命名 |
m | 创建文件 |
w | 写权限 |
M | 文件传输模式(通过FTP设置文件权限 ) |
M Beispiel:
Gehen Sie zum Server und überprüfen Sie die Berechtigungen:
Sie können sehen, dass die Berechtigungen wurden geändert.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie einen FTP-Serverdienst in Python (Sammlung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!