黨宇超 孫文俊 孔強
(杭州應(yīng)用聲學(xué)研究所 浙江省杭州市 310000)
FTP 協(xié)議是用于文件交互的協(xié)議,該協(xié)議以明文的方式進行傳輸,在公共網(wǎng)絡(luò)會面臨極大風(fēng)險。但是對于自成體系的局域網(wǎng)系統(tǒng)來說,在不考慮惡意破壞的情況下,采用FTP可以方便地滿足系統(tǒng)內(nèi)部絕大多數(shù)的文件交互需要。
FTP 服務(wù)為C/S 架構(gòu),F(xiàn)TP 服務(wù)端本身提供了文件傳輸、命令交互、用戶管理、日志記錄、目錄限制等功能。如果基于服務(wù)端使用這些功能,需要基于服務(wù)端的配置文件。但是在某些場景下,變動服務(wù)器的配置文件不太方便甚至不可能。如果基于FTP 客戶端實現(xiàn)這些功能,就可以在不變動服務(wù)端配置的情況下達到目標(biāo)。如今市面上已經(jīng)有很多成熟的FTP 客戶端軟件,但無法滿足特定的用戶管理、日志記錄、遠程備份等功能,同時還存在一些不方便使用的地方。
本文主要介紹了如何基于QT 實現(xiàn)上述功能的FTP 客戶端軟件,同時介紹了實現(xiàn)時需要注意的問題。
本軟件面向兩類用戶,分別是管理員和普通用戶。軟件基于管理員對軟件的配置運行。管理員配置好各用戶的登陸信息、訪問權(quán)限、操作限制,普通用戶只能基于管理員的設(shè)置和給定的用戶登錄信息登陸軟件并使用。管理員的登陸權(quán)限需要由超級管理員發(fā)放。超級管理員根據(jù)管理員提供的MAC 地址生成管理員的密碼以供其登陸。在這種模式下,軟件的權(quán)限層次分為三級,超級管理員控制軟件管理權(quán)限的分發(fā),普通管理員控制普通用戶的用戶信息及其操作權(quán)限、可訪問目錄等。
本軟件主要分為三個功能模塊:本地文件編輯模塊、文件傳輸模塊、用戶管理模塊。本地編輯模塊包括本地文件夾創(chuàng)建、本地文件(夾)刪除、本地文件(夾)重命名、本地文件(夾)比對。文件傳輸模塊包括文件上傳、文件下載、一鍵上傳(多地址上傳)。用戶管理模塊負責(zé)用戶信息、權(quán)限的增刪改查和控制。如圖1 所示。
圖1 :FTP 客戶端軟件架構(gòu)
Qt 是一個跨平臺的基于多種編程語言圖形界面框架,能較好地支持界面設(shè)計,封裝了網(wǎng)絡(luò)編程、多線程、數(shù)據(jù)庫連接等基礎(chǔ)功能,具有良好的跨平臺性,有通用的成熟的應(yīng)用插件,也可以方便地創(chuàng)建自定義插件。軟件使用QtCreator工具開發(fā)。QtCreator 是一款輕量級集成開發(fā)環(huán)境,具有高級的代碼編輯器、項目生成和部署工具、性能分析工具以及大量的樣例工程。
Ftp 客戶端在本地進行用戶管理、權(quán)限控制需要基于本地文件或配置信息進行管理,所以,需要考慮恰當(dāng)?shù)奈募用?,并輔助以其他措施來禁止人為對這些文件的更改或破壞。通過考察目前最廣泛流行的Ftp 客戶端軟件,可以吸收其設(shè)計上的優(yōu)越之處,同時在實現(xiàn)時,要充分考慮到本地化的特征和使用需要。具體來說,軟件在實現(xiàn)時需要著重考慮以下若干問題。
Ftp 連接是不具有保密性質(zhì)的連接形式,所以,基于Ftp連接的保密和控制只能做到一般意義上的簡單控制,不可能完全做到保密。因此,本軟件也只是適用于不需要考慮惡意破壞的內(nèi)部使用場景。
基于客戶端控制的Ftp 軟件運行時,需要打開配置文件、用戶信息文件、日志文件。其中,配置文件和用戶信息文件需要進行加密。如果不對這類文件進行加密,則用戶可以輕易地獲取軟件的配置和用戶信息,軟件的權(quán)限控制就失去意義。軟件加密通過Base64 編碼進行編碼轉(zhuǎn)換,然后基于固定字符串和加密時的時間對編碼“加鹽”,“加鹽”后再進行一次Base64 編碼轉(zhuǎn)換。這種加密方式較為簡易,具有一般的安全保密機制。
為了保護軟件正常使用,本軟件集成了配置文件檢測機制。如果配置文件、登陸信息文件或日志文件不存在或者遭到修改,軟件要么無法打開,要么會在使用中強制退出且無法再次打開,以此來禁止用戶對于敏感文件的惡意操作。其中,配置信息文件、登陸信息文件會在文件開頭保存有最近一次由軟件讀取該文件所生成的識別序列字符串。如果該字符串或者信息文件主體內(nèi)容被修改,軟件都被判定該信息文件失效,進而控制軟件退出。
本地文件編輯包含常見的本地文件編輯功能:創(chuàng)建文件夾、刪除文件(夾)、重命名文件(夾)、打開文件(夾)。同時,集成了文件(夾)比對功能。
在比對單個文件時,軟件會從文件名、文件路徑、文件大小、最后修改日期、文件內(nèi)容角度對文件進行比對。其中,文件內(nèi)容比對是指以二進制流讀取文件后,根據(jù)文件內(nèi)容生成一個哈希值,通過對比文件的哈希值以此來確定文件是否在內(nèi)容上完全一致。從單文件比對擴展開來,軟件可以進行本地文件夾比對、遠程與本地文件(夾)比對。其中,遠程與本地文件(夾)比對是由軟件自動下載遠程文件(夾)內(nèi)容,然后基于本地文件(夾)比對邏輯進行比對,比對結(jié)束后軟件自動刪除臨時下載的遠程文件。
FTP 的傳輸使用到兩個端口,一個端口負責(zé)控制流,一個端口負責(zé)數(shù)據(jù)流。部分開源的FTP 客戶端工具選擇用單個連接去進行控制,這樣就可能帶來一個操作問題,即在文件進行傳輸過程中,而刷新遠程目錄等控制命令難以收到回復(fù),需要等待兩次傳輸任務(wù)的間隙才能進行控制。還有部分的工具會直接在用戶界面主線程中進行文件傳輸,不構(gòu)建傳輸隊列,不易于進行異步式操作,只能等待當(dāng)前任務(wù)結(jié)束。本軟件單獨使用一個連接用于檢測服務(wù)端狀態(tài)、命令控制、遠程目錄刷新、遠程非文件傳輸任務(wù)的執(zhí)行,另外若干連接用于文件任務(wù)傳輸。
以上傳來說,本軟件有兩種連接傳輸方式。一種為“單地址連接”,一種為“一鍵上傳”。其中,“單地址連接”與一般的FTP 客戶端含義相同,即與某一FTP 服務(wù)端建立連接后,進行上傳或者下載文件。文件上傳的邏輯流程如圖2 所示。在上傳的過程,軟件會根據(jù)管理員的設(shè)置信息,判定是否需要建立用于存放備份文件、日志文件的遠程文件夾,以及在上傳文件前是否需要備份遠程文件,上傳文件后是否需要上傳日志。日志和備份文件的接口對普通用戶關(guān)閉,需要管理員為其開啟相應(yīng)的權(quán)限才能訪問。
圖2 :文件上傳流程
“一鍵上傳”的含義為:用戶指定提前設(shè)定好的若干個需要連接的地址和上傳的文件后,軟件自動與各個指定的地址建立連接并上傳指定的文件。選定本地需要上傳的文件夾后,點擊“一鍵上傳”按鈕會顯示出一個用于確認上傳信息的對話框。軟件會對當(dāng)前用戶所有可以建立連接的目標(biāo)地址進行網(wǎng)絡(luò)連接性測試,在測試結(jié)束后,對話框會顯示出各個目標(biāo)地址的可連接情況。用戶指定好需要上傳的目標(biāo)地址,確認好需要上傳的服務(wù)器目標(biāo)文件夾后,點擊“確認”就可以上傳文件。
在設(shè)置好需要上傳的本地文件(夾)或需要下載(比對)的遠程文件(夾)后,軟件會建立好傳輸隊列,在傳輸過程中即時更新傳輸進度、狀態(tài)變更、本地日志。在傳輸結(jié)束后,會適時上傳日志信息,根據(jù)不同任務(wù)清空臨時文件或信息。在進行上傳的任務(wù)中,最常見的問題就是網(wǎng)絡(luò)故障。當(dāng)出現(xiàn)網(wǎng)絡(luò)問題時,應(yīng)該對隊列中后續(xù)的相同目標(biāo)地址的任務(wù)進行處理,避免進行無效的嘗試。在失敗任務(wù)隊列中,本軟件提供了恢復(fù)失敗任務(wù)的功能,即在經(jīng)過測試可以正常連接后,一鍵恢復(fù)由于連接中斷導(dǎo)致失敗的任務(wù)。
對于“一鍵上傳”這種需要將文件上傳至多個地址的任務(wù)來說,本軟件利用連接池來加快上傳速度,減少資源閑置。
需要注意的是,Qt4 版本中的QFtp 連接類存在偶發(fā)的下載完成后無法返回任務(wù)完成信號的Bug。所以,在Qt4 版本下,可以利用QFtp 等連接類進行上傳任務(wù),利用其他的連接類或自定義連接類進行其他任務(wù),即在連接池中構(gòu)建多種類型的連接以適應(yīng)不同的任務(wù)。Qt5 版本下,官方版本已經(jīng)去除了QFtp 這一連接類,在開源倉庫中存在非官方的適用于Qt5 的第三方庫,不過,其效率和穩(wěn)定性未被充分驗證。
在構(gòu)建連接池時,有一些問題需要注意:連接池中的連接需要避免反復(fù)地連接,否則容易造成服務(wù)器拒絕服務(wù)。具體來說,在構(gòu)建上傳任務(wù)序列時,需要對上傳任務(wù)進行排序和規(guī)整,避免連接在不同地址間高頻來回切換,即對于地址相同的任務(wù)來說,要使用連接池中已經(jīng)連接到該地址的連接。要避免多個連接同時連接至相同的地址,否則,只會弱化該地址上各個連接的上傳速度,不會帶來效率上的提升。在將本地某一文件上傳到多個目標(biāo)服務(wù)端時,在打開本地文件后,需要控制好文件的狀態(tài),避免文件被不合適地關(guān)閉導(dǎo)致任務(wù)上傳的失敗。
本軟件采用基于本地文件的登陸方式,登陸所用的本地文件經(jīng)過軟件加密。用戶信息、設(shè)置信息只能在成功登陸軟件后由軟件進行解密后才能展示。
用戶在使用軟件前必須先登錄,依自己的權(quán)限使用軟件。用于管理用戶帳號和可訪問目錄的“用戶管理”頁面只有管理員才能看到,普通用戶無法訪問。以管理員身份登陸到系統(tǒng)后,管理員可以訪問和編輯普通用戶的可訪問目錄。其中可訪問目錄的格式為“目標(biāo)地址1={遠程目錄1,遠程目錄2}&目標(biāo)地址2...”,含義為:指定用戶登錄系統(tǒng)后,只能訪問可訪問目錄里指定的目標(biāo)地址和目標(biāo)地址下指定的若干個目錄(包含該目錄下的目錄)。
管理員的權(quán)限由超級管理員發(fā)放,管理員的軟件登錄密碼與安裝軟件的計算機的MAC 地址綁定。即超級管理員通過軟件的管理員密碼生成功能,根據(jù)管理員所用計算機的MAC 地址,生成一串密碼交由管理員用于登錄軟件。在這種方式下,軟件的管理員權(quán)限被限定于特定的計算機,以此來控制管理員的權(quán)限不擴散。
部分Ftp 客戶端軟件在進行Ftp 交互時,未充分考慮到中文使用環(huán)境,所以,在命令交互時,未進行編碼轉(zhuǎn)換。如此會導(dǎo)致上傳本地帶中文字符的文件或文件夾到遠程目錄后,遠程的對應(yīng)文件(夾)出現(xiàn)亂碼,且文件(夾)由于亂碼無法進行遠程重命名、修改或刪除等操作,文件(夾)難以從服務(wù)器清除。因此,在進行命令交互時,需要注意將編碼變換為統(tǒng)一的編碼后進行Ftp 的命令交互。以上傳舉例來說,在本地構(gòu)建好上傳隊列后,在執(zhí)行上傳命令之前,需要將隊列中的本地路徑全部進行編碼轉(zhuǎn)換,然后以轉(zhuǎn)換后的路徑與服務(wù)端進行上傳交互。類似的,在獲取到遠程目錄時,需要以上傳時編碼的逆向操作來其進行編解碼,再對結(jié)果進行處理。
本軟件界面設(shè)計如圖3 所示,界面主體由上方的工具欄,中部本地、遠程文件樹,以及下方的傳輸隊列及狀態(tài)展示組成。軟件去除了很多Ftp 客戶端中控制臺的信息,將控制臺對應(yīng)的命令交互日志信息保存于后臺日志文件中。對于普通用戶來說,這些信息的意義不大,具體的錯誤信息可以通過錯誤提示的形式反饋給用戶。以管理員身份登錄軟件并連接某一服務(wù)端后,可以看到本地及遠程文件樹。在此狀態(tài)下,用戶可以進行上傳、下載、遠程刷新、遠程刪除、本地(遠程)文件對比等操作。
圖3 :文件上傳圖示
如圖4 所示,以測試身份登錄軟件??梢钥吹杰浖戏降挠脩艄芾斫缑嬉呀?jīng)不對其開放了。選取好本地文件,點擊“一鍵上傳”,可以看到基于配置文件的若干連接地址。軟件首先會對用戶指定的地址進行可連接性測試,測試結(jié)束后,地址狀態(tài)會被更新。其中,狀態(tài)為綠色的表示可以建立連接,狀態(tài)為紅色的表示無法建立連接。用戶確認需要上傳的地址后,就可以上傳本地文件到選取的可以建立連接的若干地址的特定遠程目錄下。
圖4 :一鍵上傳圖示
需要注意的時,在“單地址連接”時,每上傳一個文件(夾)結(jié)束,需要刷新遠程目錄樹以給用戶上傳結(jié)果的反饋。但是,在“一鍵上傳”模式下,由于存在多個遠程目錄樹,如果也以如此方式進行刷新,會導(dǎo)致界面高頻切換和刷新,且用戶無法進行操作。因此,在這種模式下,應(yīng)該禁止單地址連接及遠程文件樹的顯示和操作。用戶可以通過下方的任務(wù)進行列表查看任務(wù)進行情況。
如圖5 所示,登陸軟件后,分別添加本地兩個文件夾到文件夾對比后,軟件會依次讀取兩文件夾內(nèi)的文件并計算哈希值,最后將重要文件信息羅列出來,排序并進行比較。文件列表會被按名稱進行排序,其中,文件名稱、大小、內(nèi)容全部一致的會被標(biāo)為綠色。在進行文件夾比對時,需要通過異步的方式來處理任務(wù)。即建立后臺線程去依次讀取文件,不宜將處理過程放在主界面線程中。
圖5 :本地文件夾比對
本文介紹的軟件為一款基于Qt 框架的Ftp 客戶端軟件,除了擁有一般Ftp 客戶端軟件基礎(chǔ)的本地編輯和文件訪問功能外,還結(jié)合特定場景使用需求,集成了基于客戶端的權(quán)限控制、日志記錄、文件備份、一鍵上傳等功能。軟件對多個模塊的若干使用細節(jié)進行了優(yōu)化處理,提升了對主體任務(wù)傳輸處理的速度。