- Python自動化運維快速入門
- 鄭征
- 1461字
- 2019-12-09 14:48:21
2.6 搭建FTP服務器與客戶端
熟悉FTP的讀者可能會覺得這個太簡單了,直接在網上下載軟件安裝運行就可以了,客戶端和服務器都有,但是只能滿足一些簡單的工作需求。如果我們通過寫Python代碼搭建FTP服務器和客戶端,就能實現一些更為精細化的控制,如精細的訪問權限配置、詳細的日志記錄等,根據工作經驗,Python搭建FTP服務器也非常簡單,而且更為穩定,下面就讓我們一起來學習吧。
2.6.1 搭建FTP服務器
FTP(File Transfer Protocol,文件傳輸協議)運行在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.17所示。

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

圖2.18 ftp的被動模式
簡單總結:主動方式對FTP服務器的管理有利,但對客戶端的管理不利。因為FTP服務器企圖與客戶端的高位隨機端口建立連接,而這個端口很有可能被客戶端的防火墻阻塞掉。被動方式對FTP客戶端的管理有利,但對服務器端的管理不利。因為客戶端要與服務器端建立兩個連接,其中一個連到一個高位隨機端口,而這個端口很有可能被服務器端的防火墻阻塞掉。
使用Python搭建一個FTP服務器需要pyftpdlib模塊,安裝非常簡單。執行以下命令進行安裝:
pip install pyftpdlib
(1)快速搭建一個簡單的FTP服務器。執行:
python -m pyftpdlib -p 21
即可在執行命令所在的目錄下建立一個端口為21的供下載文件的FTP服務器,注意Linux系統需要root用戶才能使用默認端口21,windows系統中目錄文件名可能是亂碼,原因是pyftpdlib內部使用utf8,而windows使用gbk,參照下面的步驟可解決windows系統的亂碼問題。
首先,找到pyftpdlib源文件所在的目錄。
>>> import pyftpdlib >>> pyftpdlib.__path__ ['C:\\Users\\xx\\projectA_env\\lib\\site-packages\\pyftpdlib']
其次,在目錄pyftpdlib源文件所在的目錄找到文件filesystems.py和handlers.py,先備份。
再次,打開filesystems.py,找到
yield line.encode('utf8', self.cmd_channel.unicode_errors)
共有兩處,修改'utf8'為'gbk',保存并退出。
打開handlers.py,找到
return bytes.decode('utf8', self.unicode_errors)
修改utf8為gbk,保存并退出。
最后,驗證亂碼已解決。
(2)搭建一個具有訪問權限,可配置相關信息的FTP服務器(ftpserver.py)。

執行python ftpserver.py得到如圖2.19所示的結果。

圖2.19 運行結果
同時該目錄下也會生成一個myftpserver.log文件,文件內容與屏幕上的信息一致。
下面我們登錄該FTP并列出目錄進行測試,如圖2.20所示。

圖2.20 客戶端運行結果
對應服務器的打印信息如圖2.21所示。

圖2.21 服務端運行結果
至此,一個FTP服務器已經搭建完成,大家可以修改ftpserver.py來滿足自己的需求。
在此附上用戶權限的代碼及說明,參見表2-7和表2-8。
表2-7 讀權限

表2-8 寫權限

2.6.2 編寫FTP客戶端程序
在實際應用中可能經常訪問FTP服務器來上傳或下載文件,Python也可以替我們做這些。
【示例2-28】下面請看一個例子(ftpclient)。

運行結果如圖2.22所示。

圖2.22 運行結果
FTP客戶端程序的編寫還可以參照官方文檔,以滿足個性化的需求。
- CentOS 7 Linux Server Cookbook(Second Edition)
- Designing Hyper-V Solutions
- Learning SQLite for iOS
- Modern JavaScript Applications
- Unreal Engine 4 Shaders and Effects Cookbook
- C語言程序設計教程
- 計算機應用基礎實踐教程
- HTML 5與CSS 3權威指南(第3版·上冊)
- Python函數式編程(第2版)
- Learning Cocos2d-JS Game Development
- Node.js應用開發
- Spring Boot 3:入門與應用實戰
- 3D Printing Designs:Design an SD Card Holder
- C#程序開發教程
- Mastering Rust