Python的网络编程[1] -> FTP 协议[1] -> 使用 pyftplib 建立 FTP 服务器
使用 pyftplib 建立 FTP 服务器
pyftplib 主要用于建立 FTP Server,与 ftplib 建立的 Client 进行通信。
快速导航
1. 模块信息
2. 建立 FTP 服务器
1.1 servers模块
用于建立服务器
1.1.1 FTPServer()类
类实例化:ftpServer = FTPServer(address, handler)
类的功能: 用于建立服务器
传入参数: address, handler
address: tuple类型,包含ip地址和端口号
handler: type类型,可直接传入FTPHandler 模块
返回参数: ftpServer
1.1.1.1 serve_forever()方法
函数调用: ftpServer.serve_forever()
函数功能:用于启动服务器
传入参数: 无
返回参数: 无
1.1.1.2 close_all()方法
函数调用: ftpServer.close_all()
函数功能:用于关闭服务器
传入参数: 无
返回参数: 无
1.1.1.3 max_cons属性
属性调用: handler.max_cons = num
属性功能:用于设置最大连接数
属性参数: num
num: int类型
1.1.1.4 max_cons_per_ip属性
属性调用: handler.max_cons _per_ip = num
属性功能:用于设置最多ip数
属性参数: num
num: int类型
1.2 handlers模块
用于建立句柄
1.2.1 FTPHandler()类
handler = FTPHandler
用于建立服务器时传入FTPServer
1.2.1.1 banner属性
属性调用: handler.banner = info
属性功能:用于设置欢迎信息
属性参数: info
info: str类型,欢迎词字符串
1.2.1.2 authorizer属性
属性调用: handler.authorizer = authorizer
属性功能:用于设置许可用户信息
属性参数: authorizer
authorizer: instance类型,由DummyAuthorizer生成
1.2.1.3 passive_ports属性
属性调用: handler.passive_ports = range(from_port, to_port)
属性功能: 被动模式端口范围,该范围需大于最大ip连接数,否则可能造成连接失败
属性参数: range(from_port, to_port)
from_port: int类型,端口范围起始点
to_port: int类型,端口范围结束点,比实际最大端口大1
1.3 authorizers模块
用于授权用户等操作
1.3.1 DummyAuthorizer()类
类实例化:authorizer = DummyAuthorizer()
类的功能:用于创建权限类实例,进行用户信息授权
传入参数: 无
返回参数: authorizer
1.3.1.1 add_user()方法
函数调用: authorizer.add_user(username, password, homedir, perm=’elr’, msg_login=’Login successful.’, msg_quit=’Goodbye.’)
函数功能: 用于添加许可用户及其信息
传入参数: username, password, homedir, perm, msg_login, msg_quit
username: str类型,用户名
password: str类型,密码
homedir:str类型,路径
perm: str类型,权限
msg_login: str类型,登录信息
msg_quit: str类型,离开信息
返回参数: 无
关于权限,
读权限:e 改变文件目录,l 列出文件,r 从服务器接收文件
写权限:a 文件上传,d 删除文件,f 文件重命名,m 创建文件,w 写权限 ,M 文件传输模式(通过FTP设置文件权限 )
1.3.1.2 add_anonymous()方法
函数调用: authorizer. anonymous(homedir, perm=’elr’, msg_login=’Login successful.’, msg_quit=’Goodbye.’)
函数功能: 用于添加匿名登录许可
传入参数: homedir, perm, msg_login, msg_quit
homedir:str类型,路径
perm: str类型,权限
msg_login: str类型,登录信息
msg_quit: str类型,离开信息
返回参数: 无
服务器建立步骤主要有:
(1) 设定IP和端口号(常用21),生成handler
(2) 生成ftp实例,设置banner;
(3) 添加用户信息或匿名授权;
(4) serve_forever()开启服务器;
(5) close_all()函数结束服务器。
1 from pyftpdlib.servers import FTPServer 2 from pyftpdlib.handlers import FTPHandler 3 from pyftpdlib.authorizers import DummyAuthorizer 4 5 class FTP_Server(): 6 def __init__(self): 7 handler = FTPHandler # handler is a class(type is 'type') 8 ip = '127.0.0.10' 9 port = 21 10 address = (ip, port) 11 self.ftpServer = FTPServer(address, handler) 12 self.ftpServer.max_cons = 150 # max connection numbers 13 self.ftpServer.max_cons_per_ip = 10 # max connection ip numbers 14 print('FTP server created') 15 print(self.ftpServer) 16 # Change welcome info when client logined in 17 self.ftpServer.handler.banner = 'Welcome to my FTP server.' 18 # Passive port number should be more than max ip number, otherwise may course connection failed 19 self.ftpServer.handler.passive_ports = range(2000, 2333) 20 21 # User info bin 22 self.userInfo = {'User_1': {'user_name': 'Admin', 23 'password': '888888', 24 'home_path': '.\\FTPServerFile', 25 'permission': 'elradfmwM', 26 'msg_login': 'Admin login successful', 27 'msg_quit': 'Goodbye, admin.'}, 28 'User_2': {'user_name': 'Customer', 29 'password': '777777', 30 'home_path': '.\\FTPServerFile', 31 'permission': 'elr', 32 'msg_login': 'Customer login successful', 33 'msg_quit': 'Goodbye, customer.'}} 34 35 def addUser(self): 36 # Add users method_1 37 authorizer = DummyAuthorizer() 38 # Add new user, user name, password, home path('.' is current root path), permission level 39 for user in self.userInfo.values(): 40 authorizer.add_user(user['user_name'], user['password'], user['home_path'], 41 perm=user['permission'], msg_login=user['msg_login'], msg_quit=user['msg_quit']) 42 self.ftpServer.handler.authorizer = authorizer 43 44 # Add users method_2 45 # Mark here: handler.authorizer also generate from DummyAuthorizer inside Handler module 46 # for user in self.userInfo.values(): 47 # self.ftpServer.handler.authorizer.add_user(user['user_name'], user['password'], user['home_path'], 48 # perm=user['permission'], msg_login=user['msg_login'], msg_quit=user['msg_quit']) 49 50 # Add anonymous 51 authorizer.add_anonymous('.\\FTPServerFile', 52 perm='elr', msg_login='anonymous login successful', msg_quit='Goodbye, anonymous.') 53 54 def run(self): 55 print('FTP server start') 56 self.ftpServer.serve_forever() 57 58 def stop(self): 59 self.ftpServer.close_all() 60 61 ftp_server = FTP_Server() 62 ftp_server.addUser() 63 ftp_server.run()
Note:
第 19 行:被动模式设置的端口数量应大于最大端口数,否则会产生报错
第 38-48 行:添加用户即可以通过 DummyAuthorizer 类生成一个新的实例进行设置,再传给 ftp 实例(42行),也可以直接通过 ftpServer.handler.authorizer 获取原本的 DummyAuthorizer 实例进行设置。
相关阅读
1. ftp 客户端
参考链接