2014-08-28 328 views
-2

還有一個有趣的問題。我的公司最近切換到ProFTP來處理它的FTP和SFTP需求。我們主要運行RHEL 5服務器。我們的用戶可以登錄並傳輸文件而不會有任何問題(無論如何,大部分都是:-P)。ProFTPd支持MLST和MLSD命令

然而,我們的一個客戶需要在執行文件傳輸操作後列出一個單獨的文件(在他們的FTP會話中),這成爲一個奇怪的問題。他們能夠使用'ls'列出整個目錄,但是如果使用確切的文件名(和/或使用通配符),則列表失敗。

我能夠使用ncftp在我的Windows工作站上覆制問題,但不能在我的Linux工作站上覆制問題。打開兩個客戶端的調試信息,並在服務器端啓用完整的FTP命令日誌記錄後,我發現Linux FTP客戶端使用LIST命令,而ncftp使用MSLD命令。

Linux客戶端:

ftp> debug 

Debugging on (debug=1). 

ftp> ls file.txt 

ftp: setsockopt (ignored): Permission denied 

---> PASV 

227 Entering passive mode (X.X.X.X). 

---> LIST file.txt 
150 Opening ASCII mode data connection for file list 

-rw-r--r-- 1 0  root  9318400 Aug 28 07:29 file.txt 
226 Transfer complete 

的ncftp(Windows)中的客戶端:

ncftp/> debug 

ncftp/> ls file.txt 
> ls file.txt 


Cmd: PASV 

227: Entering passive mode (X.X.X.X). 

Cmd: MLSD file.txt 
550: 'file.txt is not a directory 

List failed. 

從我已經能夠到目前爲止收集,MLSD和MLST是傳統FTP的擴展版本LIST命令。但是,當列出單個文件時,客戶端不應該向服務器發出MLST命令而不是MLSD命令? MLSD應該用來列出目前爲止我讀過的所有目錄。

我還以調試模式(包括ncftp)連接到我們的舊FTP服務器(運行VSFTP)與多個客戶端,並確認他們都使用舊的LIST命令的一切,它的工作完美。無論是因爲它是在服務器端執行還是巧合,我都不知道。

我也讀過mod_facts需要啓用MLSD/MLST工作。我已經證實了我的proftpd的版本支持它,而且它在服務器上啓用:

[[email protected] ~]# proftpd -v 

ProFTPD Version 1.3.5 


From proftpd.conf: 
# Adding support for extended FTP listing commands (e.g. MLST, MLSD, etc) 

LoadModule mod_facts.c 

<IfModule mod_facts.c> 
     FactsAdvertise off 
</IfModule> 

我也試着切換FactsAdvertise和關閉,重新加載服務爲我這樣做,和客戶端ncftp的STILL想要做個人檔案的MLSD!

所以我的兩個基本問題是:

  • 我怎樣才能得到的proftpd發揮好與MLSD/MLST命令,如果 這是太多的麻煩。 。
  • 如何強制連接到ProFTP服務器的FTP客戶端使用 傳統的LIST命令,如我們的 舊的FTP服務(VSFTP)顯然是這種情況。

在此先感謝!

回答

0

還有其他報告指出ncftp(1)沒有正確實現MLSD。特別是,根據RFC規範,MLSD命令只能用於目錄,而不能用於文件。其次,「宣傳廣告」告訴mod_facts在FEAT響應中不包含「MLSD」;符合要求的客戶端應該使用FEAT響應來確定服務器是否確實處理了MLSD/MLST命令。 ncftp(1)在這方面似乎忽略FEAT響應。

鑑於您的mod_facts模塊是一個共享模塊,那麼您只需從proftpd.conf中省略「LoadModule mod_facts.c」模塊。那麼proftpd將不支持MLSD/MLST,而ncftp(1)將回退到使用LIST。

希望這會有所幫助!