亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用python搭建FTP服務器

發布時間:2022-02-21 15:16:36 來源:億速云 閱讀:147 作者:iii 欄目:開發技術

這篇文章主要講解了“如何用python搭建FTP服務器”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何用python搭建FTP服務器”吧!

一、了解FTP服務器

  • FTP(文件傳輸協議),運行在tcp協議上,使用兩個端口,即數據端口和命令端口,也稱之為控制端口。默認情況下,20是數據端口,21是控制端口。

  • FTP有兩種傳輸模式:主動模式和被動模式

(1) 主動模式:客戶端首先從任意的非特殊端口n(大于1023的端口,也是客戶端的命令端口)連接FTP服務器的命令端口(默認是21),向服務器發出命令 PORT n+1,告訴服務器自己使用n+1端口作為數據端口進行數據傳輸,然后在n+1端口監聽。服務器收到PORT n+1后向客戶端返回一個“ACK”,然后服務器從它自己的數據端口(20)到 客戶端先前指定的數據端口(n+1端口)的連接,最后客戶端向服務器返回一個“ACK”。

(2)被動模式:為了解決服務器發起到客戶端的連接問題,開發了被動FTP,或者叫做PASV,當客戶端通知服務器處于被動模式時才啟用。在被動模式下,命令連接和數據連接都是有客戶端發起。當開啟一個FTP連接時,客戶端打開兩個非特權的任意端口(大于1023)。第一個端口連接服務器的21端口,但是與主動方式不同,客戶端不會提交PORT命令并允許服務器來回連接數據端口,而是提交PASV命令。這樣做的結果就是服務器會開啟任意一個非特權端口,并且發送PORT p命令給客戶端,然后客戶端發起從本地端口 n+1 到 服務器端口p 的連接來傳輸數據

總結:主動模式有利于對FTP服務器的管理,但是不利于對客戶端的管理。因為FTP服務器企圖和客戶端的高位隨機端口建立連接,而這個端口很有可能會被客戶端的防火墻阻塞掉。被動模式相反。

二、利用python搭建FTP服務器

python搭建FTP需要利用到pyftpdlib模塊

1.安裝 pyftpdlib 模塊

C:UsersLTP> pip3 install pyftpdlib

C:UsersLTP> python3 -m pyftpdlib -p 21

2.找到pyftpdlib模塊源文件所在目錄

C:UsersLTP> python3
……
>>> import pyftpdlib
>>> pyftpdlib.__path__
['/usr/local/python3/lib/python3.7/site-packages/pyftpdlib']

3.到 pyftpdlib目錄下

發現 filesystems.py 和 handlers.py 兩個文件,先執行備份

C:UsersLTP> dir E:PycharmProjectsuntitledproject01venvLibsite-packagespyftpdlib
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 字節
               4 個目錄 44,605,644,800 可用字節
# 備份 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.添加用戶權限和路徑,括號內的參數是(用戶名、密碼、用戶目錄、權限),可以為不同的用戶添加不同的目錄和權限
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.上傳下載的速度設置
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.監聽ip和端口 , linux里需要root用戶才能使用21端口
server = FTPServer(('0.0.0.0', 21), handler)

# 9.最大連接數
server.max_cons = 150
server.max_cons_per_ip = 15

# 10.開始服務,自帶打印日志信息
server.serve_forever()

authorizer.add_user(‘user', ‘123456', “d:/”, perm=“elradfmw”)中perm權限參數的含義:
1、讀權限:

e :改變文件目錄
l :列出文件
r :從服務器接收文件
2、寫權限

a :文件上傳
d :刪除文件
f :文件重命名
m :創建文件
w :寫權限
M:文件傳輸模式(通過FTP設置文件權限)
5.使用CMD登入FTP驗證
使用正常,認證正常

三、編寫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')

# 設置編碼方式,由于在windows系統,設置編碼方式為gbk'
ftp.encoding = 'gbk'

# 切換目錄
ftp.cwd('test')

# 列出文件夾內容
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)

執行結果:

[root@localhost python]# ./ftp.py
# 列出了test文件夾中的內容
-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文件被上傳到服務端

感謝各位的閱讀,以上就是“如何用python搭建FTP服務器”的內容了,經過本文的學習后,相信大家對如何用python搭建FTP服務器這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克苏市| 曲周县| 乐至县| 昌黎县| 水城县| 江永县| 监利县| 东丽区| 漯河市| 手机| 富锦市| 炉霍县| 伊宁县| 文成县| 彭阳县| 新营市| 河东区| 西丰县| 平湖市| 垦利县| 万州区| 威海市| 南平市| 沾化县| 邳州市| 兰西县| 长治市| 东丽区| 普安县| 西峡县| 集贤县| 河北省| 连平县| 广平县| 垫江县| 巴彦县| 辰溪县| 科尔| 石城县| 乌鲁木齐县| 文昌市|