还有另一个有趣的问题。我公司最近改用ProFTP来处理它的FTP和SFTP需求。我们主要运行RHEL 5服务器。我们的用户能够登录并传输文件而不会出现问题(无论如何,大多数情况下都是:-P)。

但是,我们的一位客户遇到了一个奇怪的问题,他们需要在执行文件传输操作后列出单个文件(在其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版本支持它,并且在服务器上启用了它:

[root@server ~]# 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)。


提前致谢!

最佳答案

还有其他报告称ncftp(1)无法正确实现MLSD。具体而言,根据RFC规范,仅应将MLSD命令用于目录,而不用于文件。其次,“ FactsAdvertise off”告诉mod_facts在FEAT响应中不包括“ MLSD”。一致的客户端应该使用FEAT响应来确定服务器是否确实处理了MLSD / MLST命令。 ncftp(1)在这方面似乎忽略了FEAT响应。

假设您的mod_facts模块是共享模块,那么,您要做的就是从proftpd.conf中省略“ LoadModule mod_facts.c”模块。然后proftpd将不支持MLSD / MLST,并且ncftp(1)将回退到使用LIST。

希望这可以帮助!

关于linux - ProFTPd支持MLST和MLSD命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25559708/

10-11 10:56