我使用Python和Twisted框架連接到FTP站點以執行各種自動化任務。我們的FTP服務器恰好是Pure-FTPd,如果這是相關的。Twisted FTPFileListProtocol和帶空格的文件名
當連接並呼籲一個FTPClient,所產生的FTPFileListProtocol的文件集合不包含任何目錄或包含空格的文件名('「)的列表方法。
有沒有其他人看到過這個?是唯一的解決方案來創建一個FTPFileListProtocol子類並覆蓋它的方法,手動解析文件/目錄名稱?
我使用Python和Twisted框架連接到FTP站點以執行各種自動化任務。我們的FTP服務器恰好是Pure-FTPd,如果這是相關的。Twisted FTPFileListProtocol和帶空格的文件名
當連接並呼籲一個FTPClient,所產生的FTPFileListProtocol的文件集合不包含任何目錄或包含空格的文件名('「)的列表方法。
有沒有其他人看到過這個?是唯一的解決方案來創建一個FTPFileListProtocol子類並覆蓋它的方法,手動解析文件/目錄名稱?
首先,如果你在一個retrieived FTP進行自動化的任務列表,那麼你或許應該尋找NLST
,而不是作爲LIST
注意到RFC 959 section 4.1.3:
NAME LIST (NLST) ... This command is intended to return information that can be used by a program to further process the files automatically.
的Twisted documentation爲LIST
說:
It can cope with most common file listing formats.
這讓我很懷疑;我不喜歡「應對」的解決方案。 LIST
用於人類消費而非機器加工。
如果目標服務器支持他們,那麼你應該更喜歡MLST
和MLSD
爲RFC 3659 section 7定義:
7. Listings for Machine Processing (MLST and MLSD) The MLST and MLSD commands are intended to standardize the file and directory information returned by the server-FTP process. These commands differ from the LIST command in that the format of the replies is strictly defined although extensible.
然而,這些新指令可能無法使用在目標服務器上,我不認爲他們會在扭曲。因此NLST
可能是你最好的選擇。
至於你的問題的要點,有三種可能的原因:
NLST
/LIST
,但有些服務器有不同的反應,如果參數提供給這些命令)您可以通過查看通過電線發送的內容來消除(2)和(3)並證明原因是(1)。如果這個選項不可用作Twisted API或Pure-FTPD服務器日誌配置的一部分,那麼您可能需要打開一個網絡嗅探器,例如tcpdump,snoop或WireShark(假設您允許在你的環境)。請注意,您不僅需要跟蹤控制連接(端口21),還需要跟蹤數據連接(因爲它包含LIST
/NLST
命令的結果)。 WireShark非常好,因爲它會爲您執行協議級分析。
祝你好運。
這是預料之中的。FTPFileListProtocol不能理解每個FTP輸出,因爲有些是古怪的。正如在文檔字符串中所解釋的:
如果您需要針對古怪的FTP服務器使用不同的惡意軟件,則可以使用 覆蓋C {fileLinePattern}或C {parseDirectoryLine()}。
在這種情況下,它可能是一個錯誤:也許你可以改進fileLinePattern並使它理解文件名和空格。如果是這樣,歡迎您在Twisted跟蹤器中打開一個錯誤。
我給你接受的答案,主要是因爲你是正確的,我應該使用NLST而不是LIST。謝謝。 – 2009-01-20 13:56:52