一直使用 samba 来更新 debian 服务器上的 web 内容,主要是方便,尤其是拷贝和更新大容量内容的时候,但是在家里的时候连接教育网的服务器很慢,samba 操作起来停顿很多,影响效率,于是安装了个可以使用虚拟用户的 vsftpd 。

需求

用一个叫做 web 的用户登录 ftp 服务器,使其可以修改 web 根目录 /www 中的内容。

直接安装二进制包

1
apt-get install vsftpd

修改配置文件

1
vim /etc/vsftpd.conf

保证下边几个参数

1
2
3
4
5
6
7
8
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=www-data
user_config_dir=/etc/vsftpd/user_conf
local_umask=022

pam_service_name=vsftpd #这个参数在最后

上边参数开启了虚拟账户访问,并将该虚拟账户映射为实际账户 www-data ,www-data 一般只要安装了 web server 就存在,这样就可以避免再单独建立新账户了。

如果你的 web 根目录不是 /www ,那根据自己需要修改 /etc/passwd 中 www-data 的 home 目录,并利用 chown 设置属主为 www-data。

1
chown -R www-data.www-data /www

在你的 mysql 服务器上的某个库里建立一个 nsftpdvu 的表,里边字段为 name和 passwd,插入一行记录,用户名为 web,密码自己设置好

安装认证模块

1
apt-get install libpam-mysql

修改认证配置

1
vim /etc/pam.d/vsftpd

把原有内容全部注释或者删掉,添加如下两行,其中的参数,比如mysql账户名密码及主机库名等根据自己 mysql 参数修改,crypt = 0 代表存储的是明文密码。

1
2
auth required pam_mysql.so user=root passwd=urdbrootpwd host=urdbserver db=urdb table=vsftpdvu usercolumn=name passwdcolumn=passwd crypt=0
account  required pam_mysql.so user=root passwd=urdbrootpwd host=urdbserver db=urdb table=vsftpdvu usercolumn=name passwdcolumn=passwd crypt=0

接下来添加账户 web 的配置文件

1
2
mkdir /etc/vsftpd
mkdir /etc/vsftpd/user_conf
1
vim /etc/vsftpd/user_conf/web

内容如下

1
2
3
4
5
6
7
8
local_root=/www
anon_world_readable_only=NO
anon_umask=022
write_enable=YES
download_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES

如果你需要添加其他账户,只需要在 vsftpdvu 表里添加账户名和密码,然后照葫芦画瓢在 /etc/vsftpd/user_conf 目录中再建立一个以账户名命名的配置文件即可。

重启vsftpd

1
/etc/init.d/vsftpd restart

测试用 web 登录,一切正常

另:vsftpd.conf 中的 listen ipv6 选项我开启后,说什么也连不上 ftp ,注释掉就好了,难道不能两套同时监听?

另:如果提示 vsftpd: refusing to run with writable root inside chroot()

则需要使用如下命令将用户主目录的属性去掉可写

1
chmod a-w /www