chroot失败需依次检查:PureDB中ChrootEveryone是否启用且用户home路径正确设置;pure-ftpd启动时是否加载-puredb参数;chroot目录权限是否为绝对路径、非符号链接、无组/他人写权限。

chroot 失败时先检查 PureDB 中的 ChrootEveryone 配置是否生效
如果虚拟用户登录后无法 chroot 到指定目录,或报错 500 OOPS: priv_sock_get_result 或 530 Login authentication failed,大概率是 PureDB 数据库里没正确设置 chroot 路径,或全局配置与数据库记录冲突。ChrootEveryone 是 pure-ftpd 的全局开关,它控制是否对所有用户(包括虚拟用户)强制启用 chroot;但它本身不指定路径——路径必须由每个用户的 Home directory 字段决定,且该路径需在 PureDB 中显式写入。
-
ChrootEveryone yes仅表示“启用 chroot”,但不会自动把用户锁进/home/username——你得在pure-pw useradd时用-d /path/to/chroot明确指定,并确保该路径存在、属主为该用户、权限合理 - 若用
pure-pw useradd -u ftpuser -d /srv/ftp/alice,则/srv/ftp/alice必须已存在,且ftpuser对其有读写执行权限(至少dr-xr-xr-x才能进入) - 运行
pure-pw mkdb后,务必重启pure-ftpd(不是 reload),否则新用户记录不加载
pure-ftpd 启动时未加载 -l puredb:/etc/pure-ftpd/puredb 会导致 chroot 完全失效
即使 PureDB 里写了正确的 home 目录,如果服务启动时没指定纯数据库认证方式,pure-ftpd 会退回到系统用户认证逻辑,此时虚拟用户的 chroot 设置完全被忽略。常见错误是只改了 /etc/pure-ftpd/conf/PureDB 文件,却忘了确认实际启动参数。
- 检查进程:运行
ps aux | grep pure-ftpd,确认命令行中包含-l puredb:/etc/pure-ftpd/puredb - 若用 systemd,检查
/etc/systemd/system/multi-user.target.wants/pure-ftpd.service或/lib/systemd/system/pure-ftpd.service中的ExecStart=行是否含该参数 - 若用 sysvinit,检查
/etc/default/pure-ftpd-common中的STANDALONE_OR_INETD和VIRTUALCHROOT设置——后者仅影响旧版,新版以命令行参数为准
chroot 目录权限不满足 pure-ftpd 的硬性要求会静默失败
pure-ftpd 对 chroot 根目录有严格限制:它必须是**绝对路径**、**不可被组或其他人写入**(即不能有 w 权限给 group/o),且**不能是符号链接**。违反任一条件,用户可能登录成功但立即断开,或卡在 220 后无响应。
- 错误示例:
chmod 775 /srv/ftp/alice→ group 可写,chroot 拒绝生效 - 正确做法:
chmod 755 /srv/ftp/alice && chown alice:ftpgroup /srv/ftp/alice(注意:属主不必是ftpuser,但属主用户必须能访问该目录) - 若目录下需上传文件,应在子目录(如
/srv/ftp/alice/upload)设宽松权限,而非 chroot 根目录本身 - 用
ls -ld /srv/ftp/alice确认输出中第二字段(权限位)不含w给 group/o,且无l开头
调试 chroot 失败最有效的三步:日志 + 登录测试 + 权限链验证
不要只看 FTP 客户端提示;pure-ftpd 的 chroot 错误往往不直接报出原因,得靠组合排查。
- 开启详细日志:
echo "yes" > /etc/pure-ftpd/conf/VerboseLog,然后systemctl restart pure-ftpd,再查/var/log/syslog或/var/log/messages中含chroot、priv_、auth的行 - 用
pure-ftpd -d -f -O clf:/dev/stdout前台运行(临时),观察连接全过程输出,特别留意chroot()系统调用返回值 - 模拟用户身份验证路径:
sudo -u alice ls -la /srv/ftp/alice,确认能列出内容;再sudo -u alice sh -c 'cd /srv/ftp/alice && pwd',验证 chroot 路径是否可进入
chroot 的成败不取决于配置多漂亮,而取决于那条 chroot() 系统调用能否通过内核校验——目录存在、权限干净、路径真实、用户 UID/GID 匹配,缺一不可。










