2014-08-28 129 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。

希望这会有所帮助!