我创建了一个新用户(foo
),当他通过 ftp 登录时,他无法编辑他有权访问的目录中的文件。
在他可以登录的目录中ls -l
给我:
-rw-rw-r-- 1 root www-pub 6427 Nov 17 04:21 index.html
该用户属于组www-pub
。以下是 的输出,cat /etc/group
表明他确实属于该组:
...
www-pub:x:1001:ftpuser,www-data,foo
foo:x:1002:
*编辑包含目录的权限为:
drwxrwsr-x 5 root www-pub 4096 Nov 17 02:53 thecontainingdir
以及上面的那个:
drwxrwsr-x 49 root www-pub 4096 Nov 16 02:40 thenextdirup
因此,既然他可以通过 ftp 登录,并且他需要编辑的文件具有正确的权限以让该组www-pub
读取和写入文件,并且他是该组的成员,那么为什么他不能编辑它(或上传任何内容)?
只有当我将文件更改为时,777
他才能编辑它。就好像他不在该组中……但他确实在该组中!发生了什么事?
答案1
简而言之,vsftpd 的 v3.2.5 无法在 chroot() 内部使用可写根,因此您需要使用户的根文件夹不可写,升级到新版本(并设置一些配置设置)或降级到旧版本。
细节
好的,问题源于我使用 vsftpd 版本 2.3.5(我的服务器可用的最新软件包)。此版本的 vsftpd 要求 ftp 用户主目录不具有写入权限。是的,您没有看错。因此,就我而言,我希望用户能够通过 ftp 进入 Web 根目录并开始编辑。做不到。我不得不在 Web 根目录之上创建另一个目录,将其设为用户的主目录,使其不可写入,然后用户才可以通过 ftp 进入,向下导航到 Web 根目录并按预期进行编辑/上传。
在我的情况下,这个解决方案很糟糕,因为我有许多用户在几个虚拟目录中以不同的深度进行操作,但至少它是有效的(我正在使用重写来防止人们感到困惑)。现在我需要始终确保我想要分配给特定用户的任何内容都有一个“包装器”目录。
我在网上找到的主要建议:
add `allow_writeable_chroot=YES` to your conf file
(这不仅不起作用,还导致守护进程无法重新启动。我怀疑如果您拥有更高版本(3.0+)的 vsftpd,这会起作用)
降级到 vsftpd 的先前版本
(我删除了当前版本并开始尝试让旧版本与我的服务器一起工作,但遇到了太多缺失和失败的依赖项,所以我放弃了。网上的其他人很幸运地回到了 2.3.2 版或 3.x 版,如果你可以编译自己的版本)
我在网上找到了 vsftpd 背后的一位人士提出的其他一些建议的解决方案:
在配置文件中定义选项 local_root=。必须通过 /home 或其他路径指向包含用户文件夹的目录。这样 vsftpd 就会 chroot 到 /home 目录。
(对我来说这行不通因为我无法拥有单个本地根)
在配置文件中定义选项 passwd_chroot_enable=yes,并将 /etc/passwd 文件中的用户主目录从“/home/user”更改为“/home/./user”(不带引号)。这样 vsftpd 就会 chroot 到 /home 目录。
(这在我的服务器上根本不起作用。)
下载 vsftpd-ext 的源代码,编译并覆盖现有的 vsftpd 二进制文件或从存储库中获取并添加到配置文件
选项 allow_writeable_root=yes。
(我无法在此服务器上进行编译。)