ProFTPd安装笔记, 支持Mysql虚拟用户认证和Quotas限额

Oct 21st Fri, 2011/JiaJieChan/折腾/1,789 阅读/2 评论
本教程来源于Linuxsir.org,由于教程已经是几年前的了,有很多源都已经失效了,下面的教程在源和其他方面和原文有小地方进行了修改。

系统:CentOS 5.5  x86  (服务器环境使用LNMP0.7配置)

ProFTPd版本:proftpd-1.3.0a.tar.gz

下面就开始对CentOS安装ProFTPd服务。

ProFtpd1.3.0a下载地址:

ftp://ftp.ch.proftpd.org/mirror/proftpd.org/historic/source/proftpd-1.3.0a.tar.gz

ftp://ftp.uk.proftpd.org/historic/source/proftpd-1.3.0a.tar.gz

如果上面的这两个源都失效的话,请到我的115网盘下载,然后上传到root目录,接着下面的教程。

http://115.com/file/clf2wi2r

安装ProFTPd前需要安装gcc,请确认你的服务器/VPS已安装gcc,如果没有安装gcc可以通过下面的命令安装。

[root@localhost ~]# yum install gcc

ProFTPd解压、编译、安装

[root@localhost ~]# cd /root

[root@localhost ~]# wget ftp://ftp.ch.proftpd.org/mirror/proftpd.org/historic/source/proftpd-1.3.0a.tar.gz

[root@localhost ~]# tar zxvf proftpd-1.3.0a.tar.gz

[root@localhost ~]# cd proftpd-1.3.0a

[root@localhost proftpd-1.3.0a]#./configure --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql \
>  --with-includes=/usr/include/mysql \
>  --with-libraries=/usr/lib/mysql \
>  --prefix=/usr/local/proftpd

[root@localhost proftpd-1.3.0a]# make
[root@localhost proftpd-1.3.0a]# make install

说明:

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

这句是让编译ProFTPD 支持MySQL的模块,并有磁盘限额支持;  (本教程兼容Lnmp0.7版的所有配置,如果是使用lnmp0.7安装的mysql地址无需改动)

--with-includes=

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

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

--prefix=

这是用来指定要把ProFTPD安装在哪个位置,因为Lnmp默认都是安装在/usr/local/里的,在这里我把ProFTPD安装在了 /usr/local/proftpd 目录下,如果目录不存在,在安装的时候会自动生成;当然您也可以自己来指定ProFTPD的安装位置;当我们不需要proftpd的时候,就可以直接删除proftpd目录;这样做好象是有点方便;

如果在configure过程中,也就是上面的./configure 一长串指令执行后,有错误发生,无非是编译工具缺少或者Mysql的includes和libraries的目录指定的不对;自己想想看?

 

ProFTPD认证中的MySQL数据库

创建一个ProFTPD的数据库proftpd

首先您应该会把MySQL数据库服务器打开,以MySQL的超级管理员root进入创建名为proftpd的数据库;

[root@localhost ~]# mysql -uroot -p
Enter password:           //注:在这里请您输入MySQL的管理密码;
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41 to server version: 4.1.11
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>create database proftpd;
mysql>Grant select,insert,update,delete,create,drop,index,alter,create temporary tables,lock tables on proftpd.*  to proftpd@localhost Identified by "123456";
mysql>quit

create database proftpd; 这行是创建名为proftpd的数据库;
Grant 这行是为proftpd 数据库授权,让用户名为proftpd,密码为123456(这只是一个例子,密码自己定义),这个用来管理proftpd这个数据库;
quit 这行是退出mysql界面;

导入ProFTPd数据库

下面是一个现成的数据库,你只需要导入就行了,比较简单;把下面的代码拷贝下来,然后另存为 proftpd.sql;然后通过下面的命令来导入;

[root@localhost ~]# cd /root                                                     //进入Root目录

[root@localhost ~]# mysql -uproftpd -p proftpd <proftpd.sql                   //请先把下面的现成数据库保存为sql再上传到Root目录

Enter password:   在这里输入proftpd 数据库管理员proftpd 的密码,我们前面举例是123456,以你设置的为准;

下面是proftpd的数据库,您可以拷贝下来,另存为 proftpd.sql ,然后用上面的命令来导入;

-- 数据库: `proftpd`
--
-- --------------------------------------------------------

--
-- 表的结构 `ftpgroups`
--

CREATE TABLE `ftpgroups` (
`groupname` varchar(30) NOT NULL default '',
`gid` int(11) NOT NULL default '1000',
`members` varchar(255) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- 表的结构 `ftpusers`
--

CREATE TABLE `ftpusers` (
`userid` varchar(30) NOT NULL default '',
`passwd` varchar(80) NOT NULL default '',
`uid` int(10) unsigned NOT NULL default '1000',
`gid` int(10) unsigned NOT NULL default '1000',
`homedir` varchar(255) NOT NULL default '',
`shell` varchar(255) NOT NULL default '/sbin/nologin',
`count` int(10) unsigned NOT NULL default '0',
`host` varchar(30) NOT NULL default '',
`lastlogin` varchar(30) NOT NULL default '',
UNIQUE KEY `userid` (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- 导出表中的数据 `ftpusers`
--

INSERT INTO `ftpusers` VALUES ('test', 'test', 1000, 1000, '/home/test', '/sbin/nologin',0,'','');

-- --------------------------------------------------------

--
-- 表的结构 `quotalimits`
--

CREATE TABLE `quotalimits` (
`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'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- 表的结构 `quotatallies`
--

CREATE TABLE `quotatallies` (
`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'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

ProFTPD的配置文件proftpd.conf

在我们这个例子中,ProFTPD的配置文件在/usr/local/proftpd/etc目录中,就是proftpd.conf文件;您可以把它改名备份;

[root@localhost ~]# cd /usr/local/proftpd/etc/
[root@localhost etc]# mv proftpd.conf proftpd.confBAK

然后再新建一个 proftpd.conf 文件,内容如下;您可以对这个文件进行相应的调整;其中#号部份就是注掉的,不会生效;注意一下MySQL连接数据库部份;另外如果您不是把ProFTPD安装在了/usr/local/proftpd目录下,一些东西也是需要调整的;自己看着办吧;修改完后重新上传到proftpd的安装目录etc文件夹中。

# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.

ServerName "My TestFTP" #这是您的FTP服务器的名字,自己写定
ServerType standalone
ServerAdmin xxxxx@xxxxxxxxxxx.com #这是管理员信箱,自己来写
DefaultServer On

# Display message
DisplayLogin /usr/local/proftpd/etc/ftplogin.msg
#DisplayConnect /net/messages/ftp.pre
#DisplayFirstChdir index.txt

# Port 21 is the standard FTP port.
Port 21

# Limit users to login by username
<Limit LOGIN>
AllowAll
</Limit>

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022

# Limit login attempts
#
MaxLoginAttempts 5

# Set the maximum number of seconds a data connection is allowed
# to "stall" before being aborted.
TimeoutStalled 600
TimeoutLogin 900
TimeoutIdle 600

TimeoutNoTransfer 600

# Set the user and group under which the server will run.
User nobody
Group nobody

# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~

# Users needs a valid shell
#
RequireValidShell off

# Performance: skip DNS resolution when we process the logs...
UseReverseDNS off

# Turn off Ident lookups
IdentLookups off

# Restart session support
#
AllowStoreRestart on
AllowRetrieveRestart on

#-------- load sql.mod for mysql authoritative --------#

SQLConnectInfo proftpd@localhost proftpd 123456
#注:上面这行是MySQL连接服务器部份,自己根据情况来改一改;
SQLAuthTypes Plaintext
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
SQLAuthenticate users groups
SQLNegativeCache on
SQLHomedirOnDemand on
SQLLogFile /var/log/proftpd.sql.log

SQLNamedQuery getcount SELECT "count from ftpusers where userid='%u'"
SQLNamedQuery getlastlogin SELECT "lastlogin from ftpusers where userid='%u'"

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

userid='%u'" ftpusers

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 --------#

QuotaDirectoryTally on
QuotaDisplayUnits "Mb"
QuotaEngine on
#QuotaLog /var/log/proftpd.quota.log
QuotaShowQuotas on

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

#注;上面几行是存放log的设置,不必改动也行;查看log就到上面相应的文件看吧;

# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30 #注最多30个ip同时登录使用ftp;

# Maximum clients with message
#MaxClients 2 "Sorry, max %m users -- try again later"
MaxClientsPerHost 2 "Sorry, only 2 session for one host"
#注每个ip,只能两个线程程,请自己调整;
# Normally, we want files to be overwriteable.
<Directory />
AllowOverwrite on
</Directory>

RootLogin off
RequireValidShell off
# alphanumeric characters for uploads (and not shell code...)
#PathAllowFilter "^[a-zA-Z0-9_.-]()'+$"
#PathAllowFilter "^[a-zA-Z0-9 _.-]()'+$"

# We don't want .ftpaccess or .htaccess files to be uploaded
#PathDenyFilter "(\.ftp)|(\.ht)[a-z]+$"
#pathDenyFilter "\.ftp[a-z]+$"

# Do not allow to pass printf-Formats (security! see documentation!):
#AllowFilter "^[a-zA-Z0-9@~ /,_.-]*$"
#DenyFilter "%"

系统用户和用户组ftp的UID和GID的调整

由于我们在配置文件中,把ftp的用户和用户组的UID和GID都设置为了1000;所以大家在设置chown的时候不要直接输入ftp:ftp而是用1000:1000 。

本人测试,如果修改系统用户组文件,会出现无法登录SSH的问题,所以还是直接设置为1000:1000吧。

[root@localhost ~]# chown -R 1000:1000 /home

 

启动ProFTPD,并测试

[root@localhost ~]# /usr/local/proftpd/sbin/proftpd        //改成上面的安装路径
[root@localhost ~]# pgrep proftpd
22490    //每个人都不同,能出现这个数(进程数)就可以了。

上面就把proftpd 启动起来了;我们通过pgrep 来查看是否有ProFTPD的进程,查看得知已经有了;证明服务器已经启动。我们进入测试阶段;

测试:测试帐号是test,密码是test;您可以用ftp命令来测试,也可以用lftp来测试,也可以用gftp来测试;找一个FTP客户端就行;这个test帐号是怎么来的呢。回头看一下proftpd.sql那段代码中,是否有下面这行;

INSERT INTO `ftpusers` VALUES ('test', 'test', 1000, 1000, '/home/test', '/sbin/nologin',0,'','');

这是我在写文档时,添加的一个测试帐号;只要您把proftpd.sql文件导入了,就有这个帐号;您当然也可以删除它;上面这行说的是在ftpusers的表中,添加一个录;也就是ftp用户的记录;在本文的最下面有说明如何通过MySQL来管理帐号;在这里我们只是测试是不是FTP能用了;

在默认的情况下,test用户的家目录是在/home/test,密码是test;而/home/test是当您第一次以用户test登录时,系统自动建立的;这些都自动的;

这时请使用FTP客户端来测试一下,账号test ,密码test。

如果出现无法上传的问题,请设置你们的文件夹属组,添加用户的时候默认是使用了FTP组的。

用下面命令把文件夹属组改成FTP;

chown -R 1000:1000 /home/test          //这里对你的用户目录进行授权,-R为递进,这里的R是大写。

 

添加到开机自启动

[root@localhost ~]#  vi /etc/rc.local

在下面加入  /usr/local/proftpd/sbin/proftpd                       //请对照自己的安装目录进行修改

按“Esc”键,输入  “ :wq ” 保存并退出

 

关于ProFTP的服务器管理、用户管理和磁盘限额管理

ProFTPd 服务器的管理

ProFTPD服务器的启动程序是在安装目录的sbin中,也就是proftpd;我们还是以安装目录/usr/local/proftpd 为准来说明;

下面是一些实用的ProFTPD服务器管理命令

[root@localhost ~]# /usr/local/proftpd/sbin/proftpd   注:服务器的启动;
[root@localhost ~]# pgrep proftpd   注:查看服务器是不是启动起来了;如果没有进程,说明失败;
[root@localhost ~]# pkill proftpd   注:杀死proftpd的进程;也就是关掉服务器;

注意:我们更改proftpd.conf后,要重启proftpd ,否则改动不会生效。这时就要用到pkill proftpd ,然后再重启proftpd 服务器;每次改动proftpd.conf都要这么做;

下面是几个查看ProFTPD服务器状态的命令,您也可以尝试一下,具体用法自己尝试吧;具体安装目录以自己的为准。

[root@localhost ~]# /usr/local/proftpd/bin/ftpcount
[root@localhost ~]# /usr/local/proftpd/bin/ftpwho
[root@localhost ~]# /usr/local/proftpd/bin/ftptop
[root@localhost ~]# /usr/local/proftpd/bin/ftpdctl

通过MySQL来管理FTP用户

在本文档中,ProFTPD 对FTP用户是通过MySQL来进行的,现在我们分析一下我们前面所提到proftpd数据库;ftp所有的用户都装在ftpusers这个表中,我们先分析一下这个表;分析这个表的目的是我们能明白如何添加用户;

首先,我们以proftpd 用户和密码登录到MySQL;并查看ftpusers表的结构;

[root@localhost ~]# mysql -uproftpd -p
Enter password: 注:在这里输入proftpd用户的密码;

mysql>  注:成功进入;

mysql> show databases; 注:查看数据库都有哪些;
+----------+
| Database |
+----------+
| proftpd  |
| test     |
+----------+
2 rows in set (0.00 sec)
注:我们看到了proftpd 还是存在的;

mysql> use proftpd; 注:要对proftpd 数据库进行操作,我们要先USE(用)proftpd数据库;

mysql> show tables;  注;我们在执行use proftpd;后,我们再查看proftpd中所有的表;
+-------------------+
| Tables_in_proftpd |
+-------------------+
| ftpgroups         |
| ftpusers          |
| quotalimits       |
| quotatallies      |
+-------------------+
4 rows in set (0.00 sec)

我们要查看ftpusers 这个表的结构,我们要用到 DESCRIBE 这个指令,后面接表的名称;

mysql> DESCRIBE ftpusers;
+-----------+------------------+------+-----+---------------+-------+
| Field     | Type             | Null | Key | Default       | Extra |
+-----------+------------------+------+-----+---------------+-------+
| userid    | varchar(30)      |      | PRI |               |       |
| passwd    | varchar(80)      |      |     |               |       |
| uid       | int(10) unsigned |      |     | 1000          |       |
| gid       | int(10) unsigned |      |     | 1000          |       |
| homedir   | varchar(255)     |      |     |               |       |
| shell     | varchar(255)     |      |     | /sbin/nologin |       |
| count     | int(10) unsigned |      |     | 0             |       |
| host      | varchar(30)      |      |     |               |       |
| lastlogin | varchar(30)      |      |     |               |       |
+-----------+------------------+------+-----+---------------+-------+
9 rows in set (0.00 sec)

说明:

如果不懂上面的命令请无视,可以使用phpmyadmin在添加,请对应字段解释来添加。也可以对比test默认建立的那条记录。

userid 就是FTP的用户名,这个是必填写字段;
passwd 是FTP用户的密码,这个是必填写字段;
uid和gid字段默认是1000;
homedir 是FTP用户的家目录放在哪里,要自己指定;
shell 这个是用来指定用户是否能登录系统,这里默认的是不能登录,因为是虚拟用户,所以不能让虚拟用户来登录系统;所以默认是/sbin/nologin;
count 是访问次数,默认是0;
host 是登录FTP服务器的IP地址记录,可以不设置;服务器会自己纪录;
lastlogin 是最后登录时间,这个也是自动生成,可以不必理会;

如何添加用户呢?

其实添加用户的过程,也就是向proftpd 数据库中的表ftpusers插入纪录的过程;我们上面分析了表的结构;那我们就按其要求来插入用户纪录;

我们看看ftpusers的表中,有哪些纪录;

mysql> select * from ftpusers;
+--------+--------+------+------+------------+-----------+-------+-----------+---------------------+
| userid | passwd | uid  | gid  | homedir    | shell     | count | host      | lastlogin           |
+--------+--------+------+------+------------+-----------+-------+-----------+---------------------+
| test   | test   | 1000 | 1000 | /home/test | /bin/bash |     8 | 127.0.0.1 | 2006-01-02 13:03:10 |
+--------+--------+------+------+------------+-----------+-------+-----------+---------------------+
1 row in set (0.01 sec)

尝试插入一条纪录

比如我们想加一个用户,用户名为test2,密码为test2,UID和GID为都为1000,家目录位于/home/test2;值得注意的是UID和GID的只能是1000,因为我们在系统用户设置中做了改动;前面有提到;我们添加所有的FTP用户UID和GID都是 1000;

所以如果您添加用户时,只是改一下userid、passwd和homedir字段处就行了。其它不必改动,当然您非常性MySQL也没有什么不可;

INSERT INTO `ftpusers` VALUES ('test2', 'test2', 1000, 1000, '/home/test2', '/sbin/nologin',0,'','');

查看是否插入成功

mysql> select * from ftpusers;
+--------+--------+------+------+-------------+---------------+-------+-----------+---------------------+
| userid | passwd | uid | gid | homedir | shell | count | host | lastlogin |
+--------+--------+------+------+-------------+---------------+-------+-----------+---------------------+
| test | test | 1000 | 1000 | /home/test | /bin/bash | 8 | 127.0.0.1 | 2006-01-02 13:03:10 |
| test2 | test2 | 1000 | 1000 | /home/test2 | /sbin/nologin | 0 | | |
+--------+--------+------+------+-------------+---------------+-------+-----------+---------------------+
2 rows in set (0.00 sec)

再举一例;添加一个用户名为test3,密码为test3 ,并且把test3的家目录放在/opt/test3中;

mysql> INSERT INTO `ftpusers` VALUES ('test3', 'test3', 1000, 1000, '/opt/test3', '/sbin/nologin',0,'','');

添加好后,测试一下用户test3是否能登录,并且上传文件;下面的例子证明是成功的;

如果不熟悉下面的测试命令可以使用FTP软件来上传测试。

[root@localhost ~]# lftp test3:test3@localhost
lftp test3@localhost:~> ls
lftp test3@localhost:/> put /home/beinan/fcitx-3.2-051108.tar.bz2
4164490 bytes transferred
lftp test3@localhost:/> ls
-rw-r--r--   1 test3    ftp       4164490 Jan  2 06:08 fcitx-3.2-051108.tar.bz2
lftp test3@localhost:/>

如果你想删除一个用户,您可以用 MySQL的delete 指令;比如我想删除test2这个用户;可以用.....

mysql> DELETE FROM ftpusers  WHERE  userid="test2";

如果想更新一条用户纪录,比如test用户密码字段;

mysql> update ftpusers set passwd="aaasss" where userid="test";

也就是说,你想更新用户纪录的那个字段就更新什么,下面公式;

mysql>update 数据表   set 字段="赋值"  where 关健字段="字段值";

在这里关健字段是唯一的,这样才能找到你所要更新的纪录,表达不太好;如果不太熟悉,慢慢理解吧;我也不会MySQL;呵,难为人师...... 在这里,我们还是把userid 做为关健字段,因为只有这个字段才是唯一的;

再比如,我们想更新用户的家目录,比如我想把test用户的家目录改到 /opt/test;

mysql> select userid,homedir  from ftpusers where userid="test";
+--------+-----------+
| userid | homedir   |
+--------+-----------+
| test   | /home/test |
+--------+-----------+

通过上面的,我们得知test目前的家目录在/home/test,下面我们来更改到/opt/test;

mysql> update ftpusers set homedir="/opt/test" where userid="test";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select userid,homedir  from ftpusers where userid="test";
+--------+-----------+
| userid | homedir   |
+--------+-----------+
| test   | /opt/test |
+--------+-----------+

ProFTPD 用户磁盘限额管理

我们在前面所导入的proftpd 数据库中,有这样一段;

CREATE TABLE `quotalimits` (
`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'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

说明:

上面其实就是在proftpd库中创建一个表quotalimits;我们在proftpd的数据库中,再来查看一下quotalimits表的结构,这样方便我们理解和使用磁盘限额;

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;

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

先让我们对照quotalimits表的结构,然后根据表的结构来添加;

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 | |
+------------------+------------------------------------+------+-----+---------+-------+
10 rows in set (0.00 sec)

添加记录

mysql>insert into quotalimits VALUES  ('test','user','false','soft','104857600','0','0','0','0','0');

运算公式:

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

注意:磁盘限额生效,必须让FTP用户重新登录才有效;比如test用户正在ftp上,这时要先退出,然后再登录,这是磁盘限额就有效了;

查看用户空间使用情况

登录FTP后用下面的命令;

quote site quota;

举例:

lftp test@192.168.1.5:/> quote site quota;
200-The current quota for this session are [current/limit]:
Name: test
Quota Type: User
Per Session: False
Limit Type: Soft
Uploaded Mb:         19.00/95.37
Downloaded Mb:       unlimited
Transferred Mb:      unlimited
Uploaded files:      unlimited
Downloaded files:    unlimited
Transferred files:   unlimited
200 Please contact xxxxx@xxxxxxxxxxx.com if these entries are inaccurate

下面是我的管理FTP的方法,如果不懂上面的mysql在ssh的可以看下面:   [博主JiaJie Chan的方法]

其实我们可以在phpmyadmin上操作,更加方便。

已添加一个FTP用户为例,字段和上面的解释是一样的。

添加一个用户名为ftptest,密码为123456 ,目录在/home/wwwroot/ftptest 下的用户。

进入phpmyadmin,进入proftpd的数据库,点击SQL选项,以执行SQL命令。

输入下面的命令,并点击执行。到这里你应该也明白了吧。

INSERT INTO `ftpusers` VALUES ('ftptest', '123456', 1000, 1000, '/home/wwwroot/ftptest', '/sbin/nologin',0,'','');

说明:

上面已经说了,默认属组FTP已经改成1000了,所以1000不需要改动。  请不要忘了设置目录的属组;

chown -R 1000:1000 /home/wwwroot/ftptest

声明: 本文采用 BY-NC-SA 协议进行许可. 转载请出示版权信息.
  1. Oct 21st, 2011 at 15:30 / #Url

    @懒人梦醒, 这篇文章一边复制一边修改,搞了我一个多小时。

  2. Oct 21st, 2011 at 15:27 / #Url

    太高深,完全看不懂。也接触不到这些。但是沙发抢了。。。。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
支持使用Gravatar头像

JiaJieChan提醒您: 要回复某人的评论,请将鼠标移动到那条评论,评论右边就会出现Replay字样(一定是要鼠标指针中的评论),在评论框中出现的的后面下一行填写评论提交即可.被回复者将收到邮件通知噢; 要是想直接对本文评论请直接在评论框留言即可,然后点提交.