还有一个有趣的问题。我的公司最近切换到 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 客户端仍然想要对单个文件进行 MLSD!
所以我的两个基本问题是:
- 我怎样才能让 proftpd 与 MLSD/MLST 命令配合得很好,如果这太麻烦了。.
- 我如何强制连接到 ProFTP 服务器的 FTP 客户端使用传统的 LIST 命令,就像我们旧的 FTP 服务 (VSFTP) 的情况一样。
提前致谢!