个人机器需要开个文件共享,Linux机器懒得配置SMB,就直接安装了ProFtpd,以做FTP服务器
Ubuntu安装挺简单,可使用就不那么友好了,配合GAdmin-Proftpd,一样不好用。
首先就卡在用户上,默认ftp用户等等都登录不进,各种认证失败,麻烦死了
搜索一下资料,可以支持Sqlite3做后端用户认证
就修改了一下Proftpd的配置,首先在modules.conf打开sql认证的终端
LoadModule mod_sql.c
......
# Install proftpd-mod-sqlite and decomment the previous
# mod_sql.c module to use this
LoadModule mod_sql_sqlite.c
然后再配置Sqlite3的配置,直接从网络上抄下来的,内容直接存为一个文件,放在/etc/proftp.d/conf.d/目录下
#首先来说这俩,定义proftpd以什么身份来运行,跟apache里的是一个意思
#我是习惯了apache定义为www用户和www组,配置proftpd也就这样了
#以什么身份运行,我个人感觉没啥特别意义,关键是虚拟用户对实体用户的映射!
User ftp
Group nobody
#sqlite2跟3差别较大,各软件平台对其支持也是分开来的,比如PHP
#这里就是指明,使用sqlite3
SQLBackend sqlite3
#数据库文件的绝对路径,一定要绝对
SQLConnectInfo /usr/local/lib/ftpd.db
#数据库内虚拟用户的密码认证方式
#我认为Backend的意思就是数据库自己的认证方式,比如mysql的password方案
#该方案可以指定多种,使用空格隔开,按照先后,依次try
#下面这句的意思就是“先用sqlite自己的认证方式(我用的明文,其他解决方案没研究)
#如果不行,再使用crypt(3)的方案”,实际配置文件里我只要了一个Plaintext
SQLAuthTypes Plaintext Backend Crypt
#自定义存放用户信息的表和字段
#下面这句的意思就是
#users表 里的 字段:用户名 密码 系统映射uid 系统映射gid 主目录 shell路径
#切记:表和字段的名字可以随便起(跟实际数据库中的表和字段相对应),但顺序不可乱
#按照我对英文howto的理解,前4个字段名是必须要设置的,后两个如果自己用不上
#必须使用NULL来填补,这样mod_sql模块就不会去检索这俩字段了
SQLUserInfo users user_name user_passwd uid gid home_dir NULL
#如果主目录字段名设置为NULL,那么这里这个就必须要定义
#这个是用来定义那些没有“主目录定义的用户”的主目录,有点绕口:P
#SQLDefaultHomedir “/tmp”
#这个参数设置为off的意思,是不让proftpd去检查该FTP用户映射到系统里的用户的shell
#就是说,有没有shell,我都让你登陆。特别是上面的字段,将shell路径这个设置为了NULL
RequireValidShell off
#组信息,没啥意思,就这么放着吧,意思跟上面那个SQLUserInfo一样
#表名 组名 组id 成员
SQLGroupInfo groups group_name gid members
#这里是用户身份认证的程度,只验证user,连带group啥的都验证
#图简单,我这里只验证user这一层
SQLAuthenticate users
#设置ProFTPD允许登陆的最小UID,这个UID是映射到linux系统内实际用户的UID,小于这个值将不允许登陆
#这个值如果不设置,系统默认的是999,在很多国内的文章里,uid和gid都是设置5000多
#所以即使不管这个值,也不会有问题,可是如果你跟我一样,映射用户的uid和gid都小于999了,就要注意它了
#我的www用户的uid和gid都是504,在这里,卡了我有一个多小时,TNND
SQLMinUserUID 1000
#这两个的意思,是所有未在数据库中定义uid和gid的用户的默认uid及gid
SQLDefaultUID 1001
SQLDefaultGID 1002
最后建立SQLITE3的数据库
执行sqlite3 /usr/local/lib/ftpd.db
输入如下两个SQL语句,分别创建表,及插入一个用户
CREATE TABLE "users" ("user_name" varchar(20), "user_passwd" varchar(50), "uid" int(11) NOT NULL DEFAULT 1001, "gid" int(11) NOT NULL DEFAULT 1002, "home_dir" varchar(200), "shell" varchar(200));
INSERT INTO "users" VALUES('test','test',1001,1002,'/home/www/ftp/test',NULL);
使用test用户就可以登录了。
表的uid和gid的默认值都设置为了1001/1002,即XXX用户在系统内的uid和gid的值。新添加字段时,这两个字段我也设置了。XXX用户和组在我系统内是早就建好的,uid和gid分别都是1001/1002。
通过这两个字段的值,就完成了proftpd内的虚拟用户跟系统内实体用户的映射
如果插入的虚拟用户的UID与GID都是1000,那创建的文件/目录就归属于当前用户了(大多是系统建立时的第一个用户)
然后配置目录权限,我希望做到是所有用户只允许上传、下载,不允许删除
简单配置一个文件放在/etc/proftp.d/conf.d目录下
<Limit DELE RMD>
DenyAll #全部匿名用户在download文件夹不能WRITE写入、删除、删除文件夹
</Limit>
配置文件备份:https://files.cnblogs.com/files/eaglexmw/proftpd.conf.tar.gz