MLSD (LiSt Details) 是 FTP 协议中一个非常重要且现代的命令,用于获取远程服务器上目录的详细列表,它是 LIST 和 NLIST 命令的标准化和更强大的替代品。

MLSD 是什么?
MLSD 命令属于 FTP 的扩展协议,在 RFC 3659 中定义,它的主要目标是提供一个标准化的、机器可读的目录列表格式。
与传统的 LIST 命令不同,MLSD 的输出格式是严格定义的,不依赖于服务器操作系统(如 Unix, Windows)或客户端的配置,这使得脚本和程序解析输出变得非常简单和可靠。
MLSD vs. LIST / NLIST
这是一个核心区别,理解它就能明白 MLSD 的价值所在。
| 特性 | MLSD (Machine-readable List) |
LIST (Human-readable List) |
NLIST (Name List) |
|---|---|---|---|
| 目标 | 机器可读 | 人类可读 | 人类可读 (仅文件名) |
| 格式 | 严格、标准化的格式,每行一个条目,以空格分隔的键值对。 | 格式不固定,取决于服务器和客户端,通常是 drwxr-xr-x 9 user group 4096 Jan 1 12:00 dirname。 |
每行只包含文件或目录的名称,没有其他信息。 |
| 可靠性 | 高,格式固定,易于脚本解析。 | 低,格式因系统而异,解析复杂且容易出错。 | 中等,虽然格式简单,但缺乏文件属性信息。 |
| 功能 | 提供文件类型、大小、修改时间、权限等详细属性。 | 提供文件类型、大小、修改时间、权限等详细属性。 | 仅提供文件名。 |
| 使用场景 | 自动化脚本、程序、API 调用。 | 交互式终端操作(手动查看目录)。 | 快速查看文件名列表。 |
MLSD 的输出格式
MLSD 的输出是其最大的优点,每行代表一个文件或目录,格式为:

<fact><spaces><name><CRLF>
<fact>: 一个或多个事实(facts),以分号 分隔,每个事实都是一个键值对,格式为key=value。<spaces>: 至少一个空格字符。<name>: 文件或目录的名称。<CRLF>: 回车换行符。
常见的事实(Facts):
type: 文件类型,最常见的值有:dir: 目录file: 普通文件cdir: 当前目录 (响应MLSD命令时,通常会列出当前目录本身)pdir: 父目录
size: 文件大小(以字节为单位)。modify: 文件的最后修改时间,格式为YYYYMMDDHHMMSS[.fff](年月日时分秒[毫秒])。UNIX.mode: Unix 文件权限(如0755)。UNIX.owner: Unix 文件所有者。UNIX.group: Unix 文件所属组。
示例输出:
假设你在一个包含 report.txt 和 images 目录的文件夹中执行 MLSD,可能会得到如下输出:
type=dir;modify=20251027120000; .
type=dir;modify=20251026110000; ..
type=file;size=1024;modify=20251027115000; report.txt
type=dir;modify=20251025100000; images
如何在命令行中使用 MLSD
在传统的 FTP 客户端(如 Linux/macOS 的 ftp 命令)中,MLSD 可能不可用,因为它是一个较新的扩展,现代的 FTP 客户端(如 lftp)和所有支持 FTP 的编程语言库都支持它。

使用 lftp (推荐)
lftp 是一个非常强大的现代 FTP 客户端,默认支持 MLSD。
$ lftp ftp.example.com Password: ******** lftp ftp.example.com:~> cd /path/to/directory lftp ftp.example.com:/path/to/directory> mlsd type=dir;modify=20251027120000; . type=dir;modify=20251026110000; .. type=file;size=1024;modify=20251027115000; report.txt type=dir;modify=20251025100000; images lftp ftp.example.com:/path/to/directory> exit
使用 Python (通过 ftplib 库)
Python 的标准库 ftplib 使得使用 MLSD 变得非常简单。
from ftplib import FTP
# 连接到 FTP 服务器
ftp = FTP('ftp.example.com')
ftp.login('username', 'password')
# 切换到目标目录
ftp.cwd('/path/to/directory')
# 使用 mlsd() 方法获取目录列表
# 它返回一个生成器,每个元素是一个 (name, facts) 的元组
print("Directory contents:")
for name, facts in ftp.mlsd():
print(f"Name: {name}")
# facts 是一个字典,包含所有属性
if facts.get('type') == 'file':
print(f" - Type: File, Size: {facts.get('size')} bytes")
elif facts.get('type') == 'dir':
print(f" - Type: Directory")
print("-" * 20)
# 关闭连接
ftp.quit()
MLSD 的优点总结
- 标准化和机器可读:最大的优点,输出格式固定,不依赖于操作系统,便于程序解析。
- 高可靠性:因为格式固定,所以脚本不会因为服务器换了一台机器或升级了系统而失效。
- 信息丰富:提供了比
NLIST更多的文件属性,并且比解析LIST的输出更简单、更安全。 - 国际化支持:
MLSD的输出可以正确处理包含非 ASCII 字符的文件名,而LIST的输出可能会出现问题。
注意事项
- 服务器支持:非常古老的 FTP 服务器可能不支持
MLSD命令,但在现代服务器(如 vsftpd, ProFTPD, FileZilla Server)上,这已成为标准功能。 - 防火墙/客户端:确保你的客户端和防火墙允许 FTP 数据连接(主动或被动模式),这是所有文件传输命令(包括
LIST和MLSD)正常工作的前提。
MLSD 是现代 FTP 自动化操作中首选的目录列表命令,如果你正在编写脚本或程序与 FTP 服务器交互,应该优先使用 MLSD,而不是 LIST 或 NLIST,因为它能提供更可靠、更易于处理的输出。
