Vsftpd 500 OOPS: cannot change directory

上一篇有讲到 ftp 设置用户登录的问题,然而由于权限的问题,折腾了各种配置依旧无法实现:某个用户登录后指定跳转至非根目录的目录这一需求,因此尝试换一种思路来实现。

我试了以下几种方案,均无效:

  1. setsebool ftpd_disable_trans 1 (Ubuntu server 没有安装 setsebool)SELinux 相关,猜测根目录设置在 /home 下有关
  2. chroot_list_file 相关的各种搭配

每次登录都会提示无法修改目录:

500 OOPS: cannot change directory:/test/docker/nginx/www.test.com

配置文件:

anonymous_enable=NO # 禁止匿名登录
local_enable=YES # 本地用户登录
write_enable=YES
local_umask=022
userlist_enable=YES
userlist_deny=NO
local_root=/home/ftp # ftp 根目录
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
port_enable=NO
xferlog_std_format=YES
pam_service_name=vsftpd
listen=YES
tcp_wrappers=YES
# 被动模式
pasv_enable=YES
pasv_min_port=50001
pasv_max_port=51001
allow_writeable_chroot=YES

配置的过程中有点绕的是 chroot_local_userchroot_list_enable 这两个配置,因为涉及到权限问题。

chroot_local_user=YESchroot_local_user=NO
chroot_list_enable=YES1. 所有用户限制在其主目录下
2. chroot_list_file 内指明的用户不受限制
1. 所有用户不限制在其主目录下
2. chroot_list_file 内指明的用户受限制
chroot_list_enable=NO1. 所有用户限制在其主目录下
2. 忽略 chroot_list_file 内指明的用户
1. 所有用户不限制在其主目录下
2.忽略 chroot_list_file 内指明的用户

处理完权限问题后,使用 bind 的方式挂载任意位置的文件。

mount --bind /home/ftp/testUser/html /home/test/html

经过测试,原始文件文件夹需要有可执行权限,简单一点就是设置成 755, chmod -R 755

这样 FTP 登录后可以访问这个文件夹。