官术网_书友最值得收藏!

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客戶端程序的編寫還可以參照官方文檔,以滿足個性化的需求。

主站蜘蛛池模板: 集贤县| 宁城县| 长宁县| 乐昌市| 安图县| 东丰县| 珠海市| 都兰县| 泾阳县| 五指山市| 含山县| 大同县| 区。| 将乐县| 定日县| 明光市| 平乐县| 满洲里市| 清河县| 南靖县| 德阳市| 三河市| 子长县| 诸暨市| 北海市| 甘肃省| 兴业县| 三台县| 措勤县| 沙河市| 安吉县| 三台县| 横峰县| 长子县| 翼城县| 堆龙德庆县| 扬中市| 柳河县| 东台市| 泰顺县| 陆河县|