现在的位置: 首页 > 综合 > 正文

Linux下proftpd+磁盘配额模块结合mysql的安装

2013年02月03日 ⁄ 综合 ⁄ 共 13434字 ⁄ 字号 评论关闭
近公司内部需要搭建一个linux下的ftp服务器用来测试,系统自带的ftp功能不是很多,所以在网上找了一下linux下的其他ftp软件,觉得proftpd不错,所以找了相关的教程来看一下,但是发现一个问题容易误导对linux感兴趣的朋友们,因为教程里面没有说明,所以我在此记录下来,让朋友们免走弯路。重要的一个问题就是网络上的教程都提到了“如果你的mysql是自己编译安装的,请如何做..........”这样的话,但是没有说明这个教程针对的mysql版本,顺便在网上也查了一下,使用的版本似乎很早很早了,3点几的。但是我在做的时候使用的是mysql5.×以后的版本。由于没有想到mysql版本的不同会导致安装失败,所以浪费了时间。
 
以下摘自原文:
如果你的mysql是自编译的,需要按照以下补充,解决问题 

引用:补充: 

第3步前修改“/etc/ld.so.conf” 

vi /etc/ld.so.conf 

找到:/usr/lib/mysql 

改成:/usr/local/mysql/lib/mysql 

如果没有这一行,直接当一行 

然后方可安装第3步
请重新指定mysql的lib及includes目录(例:我的mysql是安装在:/usr/local/mysql) 

./configure \ 

--prefix=/usr/local/proftpd \ 

--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql:mod_ratio \ 

--with-includes=/usr/local/mysql/include/mysql \ 

--with-libraries=/usr/local/mysql/lib/mysql
以下列出安装mysql的三个错误,请对症下药 

1. 

make[1]: *** [mod_sql_mysql.o] Error 1 

make[1]: Leaving directory `/usr/local/file/proftpd-1.2.9/modules' 

make: *** [modules] Error 2
vi contrib/mod_sql_mysql.c 

找到:#include  

改成:#include 
2.如果按上面的方法修改仍然有同样的错误,需修改 

make[1]: *** [mod_sql_mysql.o] Error 1 

make[1]: Leaving directory `/usr/local/file/proftpd-1.2.9/modules' 

make: *** [modules] Error 2
vi contrib/mod_sql_mysql.c 

找到:1293行 

把:make_scrambled_password(scrambled, c_clear, 1, NULL); 

改成:make_scrambled_password(scrambled, c_clear);
3. 

/usr/bin/ld: cannot find -lmysqlclient 

collect2: ld returned 1 exit status 

make: *** [proftpd] Error 1
cp /usr/local/mysql/lib/* /usr/lib/
 
老版本的mysql和我使用的mysql5以后的版本有些不同,在编译proftpd的时候需要执行这段命令
./configure \

--prefix=/usr/local/proftpd \

--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql:mod_ratio \ 

--with-includes=/usr/local/mysql/include/mysql \ 

--with-libraries=/usr/local/mysql/lib/mysql
 
其中两行--with-includes=/usr/local/mysql/include/mysql \ 

                --with-libraries=/usr/local/mysql/lib/mysql
所使用的目录在mysql5后版本中的目录是不同的,mysql5以后的版本在include和lib下已经没有这个mysql目录了。所以大家在使用新版本的mysql的时候一定要看清楚,不要照搬全抄。应该改为
--with-includes=/usr/local/mysql/include

--with-libraries=/usr/local/mysql/lib
 
还有上面的黄色区域
 
第3步前修改“/etc/ld.so.conf” 

vi /etc/ld.so.conf 

找到:/usr/lib/mysql 

改成:/usr/local/mysql/lib/mysql
 
改成
 
/usr/local/mysql/lib
 
这样大家再编译的时候就不会有问题了。重点就是要细心啊,主要是在网上还看到有很多人问编译为什么会出错,所以我想可能就是这个问题导致的,所以记录下来。
 
还有很多人的限额没有做成功,这是因为教程上只写了插入内容到限额的两个表中的一个上面,这样是不行的,所以两个关于限额的内容的表都要插入对应的内容这样才可以。
 
 
以下为网络上的教程:
 
 
1、什么是ProFTPD;ProFTPD 是一个FTP服务器程序,和vsftpd、wuftp 类似的FTP服务器,他们最终实现功能和目的都是一样的,都是为了传输文件; 

2、ProFTPD的下载 

proftpd-1.2.9.tar.gz 

proftpd-mod-quotatab-1.2.11.tar.gz 

(注意:如果你的mysql是自编译安装的,请先别忙着安装,请至本文最后,看完补充再装也不迟)[/color]
3、ProFTPD的编译和安装; 

tar zvxf proftpd-1.2.9.tar.gz 

tar zvxf proftpd-mod-quotatab-1.2.11.tar.gz 

cp mod_quotatab/*.c proftpd-1.2.9/contrib/ 

cp mod_quotatab/*.h proftpd-1.2.9/contrib/ 

cd proftpd-1.2.9 

./configure  

--prefix=/usr/local/proftpd  

--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql:mod_ratio  

--with-includes=/usr/include/mysql  

--with-libraries=/usr/lib/mysql 

make  

make install
说明: 

--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql  

这句是让编译ProFTPD 支持MySQL的模块,并有磁盘限额支持; 

--with-includes=  

这是来指定MySQL服务器includes所在的位置;在这里我设置的是/usr/include/mysql,因为我的MySQL服务器的includes的确在这个目录;你可以根据自己的机器环境来调整; 

--with-libraries= 

这是来指定MySQL服务器libraries所在的位置;在这里我设置的是/usr/lib/mysql,因为我的MySQL服务器的libraries的确在这个目录;你可以根据自己的机器环境来调整; 

--prefix=  

这是用来指定要把ProFTPD安装在哪个位置,在这里我把ProFTPD安装在了 /usr/local/proftpd 目录下,您不必自己建目录 /usr/local/proftpd ,在安装的时候这个目录会自动
生成;当然您也可以自己来指定ProFTPD的安装位置;当我们不需要proftpd的时候,就可以直接删除proftpd目录;这样做好象是有点方便;
创建Proftpd启动脚本 

cp contrib/dist/rpm/proftpd.init.d /etc/rc.d/init.d/proftpd 

vi /etc/rc.d/init.d/proftpd 

找到PATH="$PATH:/usr/local/sbin"这一句 

将它改成PATH="$PATH:/usr/local/proftpd/sbin" 

chmod 755 /etc/rc.d/init.d/proftpd
4.建立相应的用户和用户组 

groupadd -g 5500 ftpgroup 

adduser -u 5500 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
5、ProFTPD认证中的MySQL数据库 

引用:mysql -uroot -ppassword 

create database ftpdb; 

grant select, update on ftpdb.* to proftpd@localhost identified by 'password'; 

use ftpdb;
CREATE TABLE `ftpgroup` ( 

`groupname` varchar(16) NOT NULL default '', 

`gid` smallint(6) NOT NULL default '5500', 

`members` varchar(16) NOT NULL default '', 

KEY `groupname` (`groupname`) 

) TYPE=MyISAM COMMENT='ProFTP group table';
INSERT INTO `ftpgroup` VALUES ('ftpgroup', 5500, 'ftpuser');
CREATE TABLE `ftpquotalimits` ( 

`name` varchar(30) default NULL, 

`quota_type` enum('user','group','class','all') NOT NULL default 'user', 

`per_session` enum('false','true') NOT NULL default 'false', 

`limit_type` enum('soft','hard') NOT NULL default 'soft', 

`bytes_in_avail` float NOT NULL default '0', 

`bytes_out_avail` float NOT NULL default '0', 

`bytes_xfer_avail` float NOT NULL default '0', 

`files_in_avail` int(10) unsigned NOT NULL default '0', 

`files_out_avail` int(10) unsigned NOT NULL default '0', 

`files_xfer_avail` int(10) unsigned NOT NULL default '0' 

) TYPE=MyISAM;
CREATE TABLE `ftpquotatallies` ( 

`name` varchar(30) NOT NULL default '', 

`quota_type` enum('user','group','class','all') NOT NULL default 'user', 

`bytes_in_used` float NOT NULL default '0', 

`bytes_out_used` float NOT NULL default '0', 

`bytes_xfer_used` float NOT NULL default '0', 

`files_in_used` int(10) unsigned NOT NULL default '0', 

`files_out_used` int(10) unsigned NOT NULL default '0', 

`files_xfer_used` int(10) unsigned NOT NULL default '0' 

) TYPE=MyISAM;
CREATE TABLE `ftpuser` ( 

`id` int(10) unsigned NOT NULL auto_increment, 

`userid` varchar(32) NOT NULL default '', 

`passwd` varchar(32) NOT NULL default '', 

`uid` smallint(6) NOT NULL default '5500', 

`gid` smallint(6) NOT NULL default '5500', 

`homedir` varchar(255) NOT NULL default '', 

`shell` varchar(16) NOT NULL default '/sbin/nologin', 

`count` int(11) NOT NULL default '0', 

`host` varchar(30) NOT NULL default '000-000-000-000', 

`lastlogin` datetime NOT NULL default '0000-00-00 00:00:00', 

PRIMARY KEY (`id`) 

) TYPE=MyISAM COMMENT='ProFTP user table';
 
6.ProFTPD的配置文件proftpd.conf  

vi /usr/local/proftpd/etc/proftpd.conf 

引用:ServerName      "ProFTPD Default Installation" 

ServerType      standalone 

ServerAdmin                     myunix@hotmail.com 

DefaultServer      on 

Port        21 

Umask        022 

# 注最多30个ip同时登录使用ftp; 

MaxInstances      30 

# 设置最大的尝试登陆的次数,如果超过自动断开连接 

MaxLoginAttempts                5 

# 设置运行Proftpd服务的系统用户和组 

 User        nobody 

 Group        nobody 

# 匿名用户 这里不使用,前面加"#"注消 

#  

#   User        ftp 

#   Group        ftp 

# 删除了anonymous登录的设置
 AllowOverwrite on
# 最大的用户数 

MaxClients      100 

# 服务器的欢迎信息 

DisplayLogin      welcome.msg 

DisplayFirstChdir    .message 

# 连接时的MSG 

DisplayConnect /usr/local/proftpd/etc/connect.msg 

DisplayGoAway /usr/local/proftpd/etc/goway.msg 

# 输入quit命令后的MSG 

DisplayQuit /usr/local/proftpd/etc/quit.msg 

MaxHostsPerUser 1 

MaxClientsPerUser 2 

# 对不起,一个IP只允许一个连接 

MaxClientsPerHost 1
RootLogin off 

RequireValidShell off 

UseReverseDNS     off 

IdentLookups      off 

TimeoutStalled    600 

TimeoutLogin      900 

TimeoutIdle       600 

TimeoutNoTransfer 600 

# 让proftp支持现在流行的FXP传输方式,默认是不支持的 

AllowForeignAddress on 

# 端口也可自己指定 

PassivePorts 49152 65534 

# 允许断点续传是默认支持的,不用设置 

# 这里有一个技巧,你可以控制FTP中任一个目录有"断点续传"的功能,请设置下面一行,(例:)
AllowStoreRestart      on 

AllowRetrieveRestart   on
# 屏蔽服务器版本信息 

ServerIdent off 

# 设置ftpuser组只能访问自己的目录 

DefaultRoot ~ ftpgroup
#-------- load sql.mod for mysql authoritative --------# 

# Backend表示用户认证方式为MySQL数据库的认证方式  

# Plaintext表示明文认证方式,排在最前面的为最先使用的方式 

SQLAuthTypes Backend Plaintext 

# 数据库的鉴别 

SQLAuthenticate users* groups* 

# 数据库联接的信息 

# ftpdb是数据库名,localhost是主机名 

# proftpd是连接数据库的用户名,password是密码 

#(如果没有密码留空) 

SQLConnectInfo ftpdb@localhost proftpd password 

# 指定用来做用户认证的表的有关信息 

SQLUserInfo ftpuser userid passwd uid gid homedir shell 

SQLGroupInfo ftpgroup groupname gid members 

# 如果用户主目录不存在,则系统会根据此用户在用户数据表中的homedir字段的值新建一个目录 

SQLHomedirOnDemand on 

SQLNegativeCache   on 

# Update count every time user logs in 

SQLLogFile /var/log/proftpd.sql.log 

SQLNamedQuery getcount SELECT "count from ftpuser where userid='%u'" 

SQLNamedQuery getlastlogin SELECT "lastlogin from ftpuser where userid='%u'" 

SQLNamedQuery updatelogininfo UPDATE "count=count+1,host='%h',lastlogin=current_timestamp() WHERE userid='%u'" ftpuser 

SQLShowInfo PASS "230" "You've logged on %{getcount} times, last login at %{getlastlogin}" 

SQLLog PASS updatelogininfo 

#-------- load sql.mod for mysql authoritative --------# 
#-------- load qudes.mod for Quota limit --------# 

#打开磁盘限额引擎 

QuotaEngine on 

# 设置磁盘限额 

QuotaDirectoryTally on 

# 设置磁盘容量显示时的单位 

QuotaDisplayUnits Mb 

# 允许显示磁盘限额信息,ftp登录后可执行quote site quota命令查看当前磁盘使用情况 

QuotaShowQuotas on 

# 设置磁盘限额日志文件 

QuotaLog "/var/log/proftpd.quota.log" 

# 指定磁盘限额模块使用的数据库信息 

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, \ 

bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits \ 

WHERE name = '%{0}' AND quota_type = '%{1}'" 

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, \ 

bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies \ 

WHERE name = '%{0}' AND quota_type = '%{1}'" 

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, \ 

bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, \ 

files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, \ 

files_xfer_used = files_xfer_used + %{5} \ 

WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies 

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies 

QuotaLimitTable sql:/get-quota-limit 

QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally 

#--------- load qudes.mod for Quota limit --------# 

# Logging options 

# Debug Level 

# emerg, alert, crit (empfohlen), error, warn. notice, info, debug 



SyslogLevel emerg 

SystemLog /var/log/proftpd.system.log 

TransferLog /var/log/proftpd.xferlog 

# Some logging formats 



LogFormat default "%h %l %u %t "%r" %s %b" 

LogFormat auth "%v [%P] %h %t "%r" %s" 

LogFormat write "%h %l %u %t "%r" %s %b" 

# Log file/dir access 

# ExtendedLog /var/log/proftpd.access_log WRITE,READ write 

# Record all logins 

ExtendedLog /var/log/proftpd.auth_log AUTH auth 

# Paranoia logging level.... 

ExtendedLog /var/log/proftpd.paranoid_log ALL default
 
service proftpd restart
引用:mysql> DESCRIBE quotalimits; 

+------------------+------------------------------------+------+-----+---------+-------+ 

| Field            | Type                               | Null | Key | Default | Extra | 

+------------------+------------------------------------+------+-----+---------+-------+ 

| name             | varchar(30)                        | YES  |     | NULL    |       | 

| quota_type       | enum('user','group','class','all') |      |     | user    |       | 

| per_session      | enum('false','true')               |      |     | false   |       | 

| limit_type       | enum('soft','hard')                |      |     | soft    |       | 

| bytes_in_avail   | float                              |      |     | 0       |       | 

| bytes_out_avail  | float                              |      |     | 0       |       | 

| bytes_xfer_avail | float                              |      |     | 0       |       | 

| files_in_avail   | int(10) unsigned                   |      |     | 0       |       | 

| files_out_avail  | int(10) unsigned                   |      |     | 0       |       | 

| files_xfer_avail | int(10) unsigned                   |      |     | 0       |       | 

+------------------+------------------------------------+------+-----+---------+-------+


这个表里的各个参数分别代表: 

name 应该这样理解,既能表示单个用户,也能表示用户组名;如果我们在quota_type(限额类型)中使用group来认证的话,那就得在这里设置组名,这样整组都具有统一的磁盘
限额的特性;当然您要在ftpgroups表中插入组纪录;并且在member字段中得把用户一个一个的列进去,这是后话了;先自己研究一下,只是插入纪录的事;我们只说最简单的单个
用户的磁盘限额;默认值可以为空NULL,如果为空则针对所在有quota_type中设置的类型,比如在quota_type中设置为user ,就是针对所有ftpusers 中的用户起作用;如果是
group名,也是对ftpgroups 所有组作用; 

quota_type 磁盘限额类型,可以设置为用户,也可以设置为用户组group ;如果您的name写的是用户组,那在这里就得设置为group来认定;默认为user认证; 

per_session 默认为false; 

limit_type 默认为soft; 

bytes_in_avail 用户占用空间大小,也就是家目录的空间最大可以让用户占用多少,单位是byte;默认为0,0是不受限制,以下同理; 

bytes_out_avail 注;所有下载文件的总和,默认为0; 

bytes_xfer_avail 注;一个用户上传下载流量总和,默认为0 

files_in_avail 注:限制上传文件总数,默认为0; 

files_out_avail 注;限制下载文件个数总计,默认为0 

files_xfer_avail 注:允许下载和上传的文件总和我,默认为0;
在数据库ftpuser添加一个虚拟用户"test", 

mysql> insert into ftpuser (id,userid,passwd,uid,gid,homedir,shell) values ('1', 'test','test','5500','5500','/home/test','/sbin/nologin');
如果想删除一个用户,您可以用 MySQL的delete 指令;比如我想删除test这个用户; 

mysql> delete from ftpusers WHERE userid="test";
如果想更新一条用户纪录,比如test用户密码字段; 

mysql> update ftpuser set passwd="123456" where userid="test";
如果你想设置quota,只要在ftpquotalimits表里设置一下就行了 

我们比如想让test用户,约束空间大小为100M,其它不受限制;则可用下面的mysql命令添加; 

insert into ftpquotalimits
(name,quota_type,per_session,limit_type,bytes_in_avail,bytes_out_avail,bytes_xfer_avail,files_in_avail,files_out_avail,files_xfer_avail) values ('test',
'user', 'true', 'soft', '104857600', '0','0','0','0','0');
运算公式: 

1Kb=1024 byte 

1M=1024 Kb 

100M=100x1024 Kb= 100x1024x1024 byte=104857600 byte  

注意:磁盘限额生效,必须让FTP用户重新登录才有效;比如test用户正在ftp上,这时要先退出,然后再登录,这是磁盘限额就有效了;
 
7.设置ftp登陆欢迎信息文件: 

%T 目前的时间  

%F 所在硬盘剩下的容量  

%C 目前所在的目录  

%R Client 端的主机名称  

%L Server 端的主机名称  

%U 使用者帐户名称  

%M 最大允许连接人数  

%N 目前的服务器连接人数  

%E FTP服务器管理员的 email  

%i 本次上传的文件数量  

%o 本次下载的文件数量  

%t 本次上传+下载的文件数量
vi /home/test/welcome.msg


引用 

欢迎您%U,这是Frank的测试FTP服务器; 

目前时间是:%T; 

本服务器最多允许%M个用户连接数; 

目前服务器上已有%N个用户连接数; 

目前你所在的目录是%C; 

目录所在的硬盘还剩下%F字节。
 
 
如果你的mysql是自编译的,需要按照以下补充,解决问题 

引用:补充: 

第3步前修改“/etc/ld.so.conf” 

vi /etc/ld.so.conf 

找到:/usr/lib/mysql 

改成:/usr/local/mysql/lib/mysql 

如果没有这一行,直接当一行 

然后方可安装第3步
请重新指定mysql的lib及includes目录(例:我的mysql是安装在:/usr/local/mysql) 

./configure \ 

--prefix=/usr/local/proftpd \ 

--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql:mod_ratio \ 

--with-includes=/usr/local/mysql/include/mysql \ 

--with-libraries=/usr/local/mysql/lib/mysql
以下列出安装mysql的三个错误,请对症下药 

1. 

make[1]: *** [mod_sql_mysql.o] Error 1 

make[1]: Leaving directory `/usr/local/file/proftpd-1.2.9/modules' 

make: *** [modules] Error 2
vi contrib/mod_sql_mysql.c 

找到:#include  

改成:#include 
2.如果按上面的方法修改仍然有同样的错误,需修改 

make[1]: *** [mod_sql_mysql.o] Error 1 

make[1]: Leaving directory `/usr/local/file/proftpd-1.2.9/modules' 

make: *** [modules] Error 2
vi contrib/mod_sql_mysql.c 

找到:1293行 

把:make_scrambled_password(scrambled, c_clear, 1, NULL); 

改成:make_scrambled_password(scrambled, c_clear);
3. 

/usr/bin/ld: cannot find -lmysqlclient 

collect2: ld returned 1 exit status 

make: *** [proftpd] Error 1
cp /usr/local/mysql/lib/* /usr/lib/
 

抱歉!评论已关闭.