So implementieren Sie einen FTP-Serverdienst in Python (Sammlung)

PHPz
Freigeben: 2017-04-12 14:28:50
Original
2729 Leute haben es durchsucht

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
Nach dem Login kopieren

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()
Nach dem Login kopieren

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()
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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(&#39;#&#39;) 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(&#39;user&#39;, &#39;12345&#39;, &#39;/home/&#39;, perm=&#39;elradfmw&#39;)
user_list = get_user(&#39;/home/huangxm/test_py/FtpServer/user.conf&#39;)
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(&#39;/home/huangxm&#39;)

#初始化ftp句柄
handler = FTPHandler
handler.authorizer = authorizer

#添加被动端口范围
handler.passive_ports = range(2000, 2333)

#监听ip 和 端口
server = FTPServer((&#39;192.168.0.108&#39;, 2121), handler)

#开始服务
server.serve_forever()
Nach dem Login kopieren

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 = &#39;0.0.0.0&#39;

port = &#39;2121&#39;

#上传速度 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 = &#39;off&#39;
#匿名用户目录
anonymous_path = &#39;/home/huangxm&#39;

#是否开启日志 on|off
enable_logging = &#39;off&#39;
#日志文件
loging_name = &#39;pyftp.log&#39;

#欢迎信息
welcome_msg = &#39;Welcome to my ftp&#39;
Nach dem Login kopieren

user.py


#用户名   密码    权限     目录
#root   12345   elradfmwM  /home/
huangxm   12345   elradfmwM  /home/
test    12345   elradfmwM  /home/huangxm
Nach dem Login kopieren

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(&#39;#&#39;) 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(&#39;user&#39;, &#39;12345&#39;, &#39;/home/&#39;, perm=&#39;elradfmw&#39;)
  user_list = get_user(&#39;conf/user.py&#39;)
  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 == &#39;on&#39;:
    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 == &#39;on&#39;:
    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(&#39;开始服务&#39;)
  server.serve_forever()

if __name__ == "__main__":
  ftp_server()
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!