使用 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 客戶端
參考鏈接