python一秒搭建FTP服務(wù)器
一、了解FTP服務(wù)器
- FTP(文件傳輸協(xié)議),運行在tcp洗衣上,使用兩個端口,即數(shù)據(jù)端口和命令端口,也稱之為控制端口。默認(rèn)情況下,20是數(shù)據(jù)端口,21是控制端口。
- FTP有兩種傳輸模式:主動模式和被動模式
(1) 主動模式:客戶端首先從任意的非特殊端口n(大于1023的端口,也是客戶端的命令端口)連接FTP服務(wù)器的命令端口(默認(rèn)是21),向服務(wù)器發(fā)出命令 PORT n+1,告訴服務(wù)器自己使用n+1端口作為數(shù)據(jù)端口進(jìn)行數(shù)據(jù)傳輸,然后在n+1端口監(jiān)聽。服務(wù)器收到PORT n+1后向客戶端返回一個“ACK”,然后服務(wù)器從它自己的數(shù)據(jù)端口(20)到 客戶端先前指定的數(shù)據(jù)端口(n+1端口)的連接,最后客戶端向服務(wù)器返回一個“ACK”。
(2)被動模式:為了解決服務(wù)器發(fā)起到客戶端的連接問題,開發(fā)了被動FTP,或者叫做PASV,當(dāng)客戶端通知服務(wù)器處于被動模式時才啟用。在被動模式下,命令連接和數(shù)據(jù)連接都是有客戶端發(fā)起。當(dāng)開啟一個FTP連接時,客戶端打開兩個非特權(quán)的任意端口(大于1023)。第一個端口連接服務(wù)器的21端口,但是與主動方式不同,客戶端不會提交PORT命令并允許服務(wù)器來回連接數(shù)據(jù)端口,而是提交PASV命令。這樣做的結(jié)果就是服務(wù)器會開啟任意一個非特權(quán)端口,并且發(fā)送PORT p命令給客戶端,然后客戶端發(fā)起從本地端口 n+1 到 服務(wù)器端口p 的連接來傳輸數(shù)據(jù)
總結(jié):主動模式有利于對FTP服務(wù)器的管理,但是不利于對客戶端的管理。因為FTP服務(wù)器企圖和客戶端的高位隨機端口建立連接,而這個端口很有可能會被客戶端的防火墻阻塞掉。被動模式相反。
二、利用python搭建FTP服務(wù)器
python搭建FTP需要利用到pyftpdlib模塊
1.安裝 pyftpdlib 模塊
C:\Users\LTP> pip3 install pyftpdlib C:\Users\LTP> python3 -m pyftpdlib -p 21
2.找到pyftpdlib模塊源文件所在目錄
C:\Users\LTP> python3 …… >>> import pyftpdlib >>> pyftpdlib.__path__ ['/usr/local/python3/lib/python3.7/site-packages/pyftpdlib']
3.到 pyftpdlib目錄下
發(fā)現(xiàn) filesystems.py 和 handlers.py 兩個文件,先執(zhí)行備份
C:\Users\LTP> dir E:\PycharmProjects\untitled\project01\venv\Lib\site-packages\pyftpdlib 2021/05/15 17:50 <DIR> . 2021/05/15 17:50 <DIR> .. 2017/12/30 16:44 35,246 authorizers.py 2021/05/15 17:49 24,798 filesystems - 副本.py 2021/05/15 17:49 24,798 filesystems.py 2019/10/24 16:26 144,635 handlers - 副本.py 2019/10/24 16:26 144,635 handlers.py 2017/12/30 16:44 36,769 ioloop.py 2019/10/24 16:26 5,823 log.py 2019/10/24 16:26 3,844 prefork.py 2019/10/24 16:26 21,658 servers.py 2021/05/15 17:45 <DIR> test 2019/10/24 16:26 774 _compat.py 2019/10/24 16:28 2,845 __init__.py 2018/04/26 18:41 4,879 __main__.py 2021/05/15 17:46 <DIR> __pycache__ 12 個文件 450,704 字節(jié) 4 個目錄 44,605,644,800 可用字節(jié) # 備份 filesystems.py 和 handlers.py # 修改filesystems.py文件 # 將原本的"utf-8"修改成"gbk"(windows支持的gbk類型的bytes) 503 yield line.encode('gbk', self.cmd_channel.unicode_errors # 修改 handlers.py 文件 # 將原本的"utf-8"修改成"gbk"(windows支持的gbk類型的bytes) 1413 return bytes.decode('gbk', self.unicode_errors)
4. 編寫并運行FTP代碼
# 該腳本程序是運行在windows上的ftp,運行前需要安裝pyftpdlib模塊, pip3 install pyftpdlib # 修改filesystems.py文件,將503 行的 "utf-8"修改成"gbk"(windows支持的gbk類型的bytes)即 yield line.encode('gbk', self.cmd_channel.unicode_errors # 修改 handlers.py 文件,將1413行的"utf-8"修改成"gbk"(windows支持的gbk類型的bytes)即 return bytes.decode('gbk', self.unicode_errors) from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler,ThrottledDTPHandler from pyftpdlib.servers import FTPServer from pyftpdlib.log import LogFormatter import logging # 1.記錄日志輸出到文件和終端 logger = logging.getLogger('FTP-LOG') logger.setLevel(logging.DEBUG) cs = logging.StreamHandler() cs.setLevel(logging.INFO) fs = logging.FileHandler(filename='test.log', mode='a', encoding='utf-8') fs.setLevel(logging.DEBUG) formatter = logging.Formatter('[%(asctime)s] %(name)s - %(levelname)s : %(message)s') cs.setFormatter(formatter) fs.setFormatter(formatter) logger.addHandler(cs) logger.addHandler(fs) # 2.實例化虛擬用戶,這是FTP的首要條件 authorizer = DummyAuthorizer() # 3.添加用戶權(quán)限和路徑,括號內(nèi)的參數(shù)是(用戶名、密碼、用戶目錄、權(quán)限),可以為不同的用戶添加不同的目錄和權(quán)限 authorizer.add_user('user', '123456', "d:/", perm="elradfmw") # 4.添加匿名用戶,只需要路徑 authorizer.add_anonymous("d:/") # 5.初始化ftp句柄 handler = FTPHandler handler.authorizer = authorizer # 6.添加被動端口范圍 handler.passive_ports = range(2000,20033) # 7.上傳下載的速度設(shè)置 dtp_handler = ThrottledDTPHandler dtp_handler.read_limit = 300 * 1024 # 300 kb/s dtp_handler.write_limit = 300 * 1024 # 300 kb/s handler.dtp_handler = dtp_handler # 8.監(jiān)聽ip和端口 , linux里需要root用戶才能使用21端口 server = FTPServer(('0.0.0.0', 21), handler) # 9.最大連接數(shù) server.max_cons = 150 server.max_cons_per_ip = 15 # 10.開始服務(wù),自帶打印日志信息 server.serve_forever()
authorizer.add_user(‘user', ‘123456', “d:/”, perm=“elradfmw”)中perm權(quán)限參數(shù)的含義:
1、讀權(quán)限:
e :改變文件目錄
l :列出文件
r :從服務(wù)器接收文件
2、寫權(quán)限
a :文件上傳
d :刪除文件
f :文件重命名
m :創(chuàng)建文件
w :寫權(quán)限
M:文件傳輸模式(通過FTP設(shè)置文件權(quán)限)
5.使用CMD登入FTP驗證
使用正常,認(rèn)證正常
三、編寫FTP客戶端程序
可以用于文件的上傳下載
[root@localhost python]# vim ftp.py #!/bin/env python3 # -*- coding: utf-8 -*- # Time: 2021-5-15 21:08 # Description: FTP CLIENT # File Name: ftp.py # FTP客戶端 from ftplib import FTP # 1.登入ftp ftp = FTP(host='192.168.0.108', user='user', passwd='123456') # 設(shè)置編碼方式,由于在windows系統(tǒng),設(shè)置編碼方式為gbk' ftp.encoding = 'gbk' # 切換目錄 ftp.cwd('test') # 列出文件夾內(nèi)容 ftp.retrlines('LIST') # 或者ftp.dir() # 下載文件 node.txt ftp.retrbinary('RETR node.txt', open('node.txt', 'wb').write) # 上傳文件ftpserver.py ftp.storbinary('STOR ftpserver.py', open('ftpserver.py', 'rb')) # 查看目錄下文件詳情 for file in ftp.mlsd(path='/test'): print(file)
執(zhí)行結(jié)果:
[root@localhost python]# ./ftp.py
# 列出了test文件夾中的內(nèi)容
-rw-rw-rw- 1 owner group 1661 May 15 14:19 ftpserver.py
-rw-rw-rw- 1 owner group 12 May 15 14:14 node.txt
# 查看到了目錄下文件的詳情
('ftpserver.py', {'modify': '20210515142003', 'perm': 'radfw', 'size': '1661', 'type': 'file'})
('node.txt', {'modify': '20210515141442', 'perm': 'radfw', 'size': '12', 'type': 'file'})
[root@localhost python]# ls # node.txt文件被下載到客戶端
ftp.py ftpserver.py node.txt
到windows的test目錄下驗證
ftpserver.py文件被上傳到服務(wù)端
以上就是python一秒搭建FTP服務(wù)器的詳細(xì)內(nèi)容,更多關(guān)于python FTP服務(wù)器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
學(xué)習(xí)win32com操作word之Range精講
這篇文章主要為大家介紹了win32com操作word之Range精講學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01解決pycharm無法刪除invalid interpreter(無效解析器)的問題
這篇文章主要介紹了pycharm無法刪除invalid interpreter(無效解析器)的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07Python pandas入門系列之眾數(shù)和分位數(shù)
分位數(shù)(Quantile),也稱分位點,是指將一個隨機變量的概率分布范圍分為幾個等份的數(shù)值點,分析其數(shù)據(jù)變量的趨勢,而眾數(shù)(Mode)是代表數(shù)據(jù)的一般水平,這篇文章主要給大家介紹了Python pandas系列之眾數(shù)和分位數(shù)的相關(guān)資料,需要的朋友可以參考下2021-08-08Python自動化爬取天眼查數(shù)據(jù)的實現(xiàn)
本文將結(jié)合實例代碼,介紹Python自動化爬取天眼查數(shù)據(jù)的實現(xiàn),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06python實現(xiàn)愛奇藝登陸密碼RSA加密的方法示例詳解
這篇文章主要介紹了python實現(xiàn)愛奇藝登陸的密碼RSA加密的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05在Python的Django框架中用流響應(yīng)生成CSV文件的教程
這篇文章主要介紹了在Python的Django框架中用流響應(yīng)生成CSV文件的教程,作者特別講到了防止CSV文件中的中文避免出現(xiàn)亂碼等問題,需要的朋友可以參考下2015-05-05計算機二級python學(xué)習(xí)教程(3) python語言基本數(shù)據(jù)類型
這篇文章主要為大家詳細(xì)介紹了計算機二級python學(xué)習(xí)教程的第3篇,python語言基本數(shù)據(jù)類型,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05scikit-learn線性回歸,多元回歸,多項式回歸的實現(xiàn)
這篇文章主要介紹了scikit-learn線性回歸,多元回歸,多項式回歸的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08