有另一个有趣的问题。我公司最近切换到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列出我到目前为止所阅读的整个目录。
我还连接到我们的旧FTP服务器(运行VSFTP)与多个客户端在调试模式(包括ncftp),并确认他们是所有使用旧的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!
所以我的两个基本问题是:
提前致谢!
答案 0 :(得分:0)
还有其他报道称ncftp(1)没有正确实施MLSD。具体来说,根据RFC规范,MLSD命令只应用于目录,而不是文件。其次,&#34; FactsAdvertise off&#34;告诉mod_facts不包括&#34; MLSD&#34;在FEAT响应中;符合客户端应该使用FEAT响应来确定服务器是否确实处理MLSD / MLST命令。 ncftp(1)似乎忽略了FEAT在这方面的反应。
鉴于您的mod_facts模块是一个共享模块,那么您需要做的就是省略&#34; LoadModule mod_facts.c&#34;来自proftpd.conf的模块。然后proftpd将不支持MLSD / MLST,并且ncftp(1)将回退到使用LIST。
希望这有帮助!
答案 1 :(得分:0)
道歉,我忘记了我还是打开了。我们在ProFTP上找到了一个解决方案: