2008-11-20 96 views
2

我使用Python和Twisted框架連接到FTP站點以執行各種自動化任務。我們的FTP服務器恰好是Pure-FTPd,如果這是相關的。Twisted FTPFileListProtocol和帶空格的文件名

當連接並呼籲一個FTPClient,所產生的FTPFileListProtocol文件集合不包含任何目錄或包含空格的文件名('「)的列表方法。

有沒有其他人看到過這個?是唯一的解決方案來創建一個FTPFileListProtocol子類並覆蓋它的方法,手動解析文件/目錄名稱?

回答

2

首先,如果你在一個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 documentationLIST說:

 
It can cope with most common file listing formats. 

這讓我很懷疑;我不喜歡「應對」的解決方案。 LIST用於人類消費而非機器加工。

如果目標服務器支持他們,那麼你應該更喜歡MLSTMLSDRFC 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可能是你最好的選擇。

至於你的問題的要點,有三種可能的原因:

  1. 返回結果的處理是不正確的(扭轉可能發生故障,你的建議,或者是其他地方)
  2. 該服務器是車,而不是發送一個正確的(完整的)響應
  3. 錯誤的命令正被髮送(不太可能與直NLST/LIST,但有些服務器有不同的反應,如果參數提供給這些命令)

您可以通過查看通過電線發送的內容來消除(2)和(3)並證明原因是(1)。如果這個選項不可用作Twisted API或Pure-FTPD服務器日誌配置的一部分,那麼您可能需要打開一個網絡嗅探器,例如tcpdump,snoop或WireShark(假設您允許在你的環境)。請注意,您不僅需要跟蹤控制連接(端口21),還需要跟蹤數據連接(因爲它包含LIST/NLST命令的結果)。 WireShark非常好,因爲它會爲您執行協議級分析。

祝你好運。

+0

我給你接受的答案,主要是因爲你是正確的,我應該使用NLST而不是LIST。謝謝。 – 2009-01-20 13:56:52

0

這是預料之中的。FTPFileListProtocol不能理解每個FTP輸出,因爲有些是古怪的。正如在文檔字符串中所解釋的:

如果您需要針對古怪的FTP服務器使用不同的惡意軟件,則可以使用 覆蓋C {fileLinePattern}或C {parseDirectoryLine()}。

在這種情況下,它可能是一個錯誤:也許你可以改進fileLinePattern並使它理解文件名和空格。如果是這樣,歡迎您在Twisted跟蹤器中打開一個錯誤。

相關問題