我正在使用 ProFTPd 1.3.5a(顺便说一句,我在较旧的 1.3.4d 上得到了相同的行为),并为 Web 服务器设置了一个非常常见的虚拟用户。
简而言之,ProFTPd 使用 apache 的 UID/GID 运行,并且有其本地文件进行身份验证。所有用户都拥有相同的真实 UID/GID(同样是 apache 的),并且在他们的目录中被 chroot,带有 DirFake* 条目。
这是配置的摘录:
AuthPAM off
AuthOrder mod_auth_file.c
AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
UseFtpUsers off
DefaultRoot ~
DefaultChdir /
DirFakeUser on ~
DirFakeGroup on ~
DirFakeMode 0644
ShowSymLinks off
Umask 026 027
<Directory ~/>
UserOwner www-data
GroupOwner www-data
</Directory>
但是对于我尝试的每个 ftp 客户端,在列出文件时我只得到数字 UID/GID 而不是虚拟用户名。这也很烦人,因为 CyberDuck 等客户端会假设数字 ID 与他们连接的用户不同,并将所有文件/目录显示为不可访问(即使尝试访问它们确实有效)。
编辑:在服务器上有一个www-data
UID 33 的“真实”用户和 GID 33 组 www-data,ProFTPd 使用该 UID/GID 运行,所有虚拟用户/etc/proftpd/ftpd.[passwd|group]
都有 uid=gid=33,用户中的所有文件目录有 uid=gid=33。现在 ftp 客户端将所有文件列为 uid 33 和 gid 33 并且无法将数字 ID 转换为用户/组名。我不想将文件显示为属于www-data
ftp 客户端,而是属于他们用来进行身份验证的用户名。mod_ls
据我了解,这也是DirFake*
选项的作用:将假用户/组扔给连接的客户端。它没有这样做,或者至少它只是为数字 ID 这样做。
如何让 ProFTPd 在列表中向客户显示虚拟用户名?
一些 FTP 客户端现在使用较新的
MLSD
/MLST
命令,而不是LIST
andNLST
来列出文件;这些较新的命令没有名称的事实,只有 ID。因此,您可以尝试添加FactsAdvertise off
到您的proftpd.conf
.,它告诉 ProFTPD 不要宣传它可以处理那些较新的 FTP 命令。这反过来会导致 FTP 客户端回退到旧的 FTP 命令,这些命令确实提供了名称。更新:我已请求向 IANA 注册两个新的 OS-Specific Facts
UNIX.ownername
并UNIX.groupname
MLSD
在列表中使用,以便能够使用该命令在列表中提供用户/组名称。我很快就会向 ProFTPD 添加对这些的支持。希望这可以帮助!